web-dev-qa-db-ja.com

インテントを使用してアクティビティからサービスにデータを渡す

呼び出しServiceから渡されたAndroid Activity内のデータを取得するにはどうすればよいですか?

62
GobiasKoffi

最初のコンテキスト(アクティビティ/サービスなど)

サービスの場合、intentに直接アクセスできるようにonStartCommandをオーバーライドする必要があります。

Override
public int onStartCommand(Intent intent, int flags, int startId) {

いくつかのオプションがあります:

1) Intent から Bundle を使用します。

Intent mIntent = new Intent(this, Example.class);
Bundle extras = mIntent.getExtras();
extras.putString(key, value);  

2)新しいバンドルを作成する

Intent mIntent = new Intent(this, Example.class);
Bundle mBundle = new Bundle();
mBundle.extras.putString(key, value);
mIntent.putExtras(mBundle);

3)Intentの putExtra() ショートカットメソッドを使用します

Intent mIntent = new Intent(this, Example.class);
mIntent.putExtra(key, value);

新しいコンテキスト(アクティビティ/サービスなど)

Intent myIntent = getIntent(); // this getter is just for example purpose, can differ
if (myIntent !=null && myIntent.getExtras()!=null)
     String value = myIntent.getExtras().getString(key);
}

注:バンドルには、「get」および「put」メソッドがありますすべてのプリミティブ型、Parcelables、Serializables。デモ用に文字列を使用しました。

29
Pentium10

「アクティビティからサービスにインテントを介してデータを送信する方法」に関するこの質問に対する正確な答えは、インテントオブジェクトを受け取るonStartCommand()メソッドをオーバーライドする必要があるということです。

Serviceを作成するときは、onStartCommand()メソッドをオーバーライドする必要があります。そのため、以下の署名をよく見ると、そこに渡されるintentオブジェクトを受け取ります:

_  public int onStartCommand(Intent intent, int flags, int startId)
_

そのため、アクティビティからサービスを開始するインテントオブジェクトを作成し、そのデータをインテントオブジェクト内に配置します。たとえば、UserIDActivityからServiceに渡します。 :

_ Intent serviceIntent = new Intent(YourService.class.getName())
 serviceIntent.putExtra("UserID", "123456");
 context.startService(serviceIntent);
_

サービスが開始されると、そのonStartCommand()メソッドが呼び出されるため、このメソッドでは、たとえばインテントオブジェクトから値(UserID)を取得できます。

_public int onStartCommand (Intent intent, int flags, int startId) {
    String userID = intent.getStringExtra("UserID");
    return START_STICKY;
}
_

注:上記の答えは、サービスのコンテキストでは正しくないgetIntent()メソッドでIntentを取得することを指定しています

194
user_CC

サービスをバインドすると、onBind(Intent intent)でExtraが取得されます。

アクティビティ:

 Intent intent = new Intent(this, LocationService.class);                                                                                     
 intent.putExtra("tour_name", mTourName);                    
 bindService(intent, mServiceConnection, BIND_AUTO_CREATE); 

サービス:

@Override
public IBinder onBind(Intent intent) {
    mTourName = intent.getStringExtra("tour_name");
    return mBinder;
}
9
Martin Pfeffer

別の可能性は、intent.getActionの使用です。

稼働中:

public class SampleService inherits Service{
    static final String ACTION_START = "com.yourcompany.yourapp.SampleService.ACTION_START";
    static final String ACTION_DO_SOMETHING_1 = "com.yourcompany.yourapp.SampleService.DO_SOMETHING_1";
    static final String ACTION_DO_SOMETHING_2 = "com.yourcompany.yourapp.SampleService.DO_SOMETHING_2";
    static final String ACTION_STOP_SERVICE = "com.yourcompany.yourapp.SampleService.STOP_SERVICE";

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String action = intent.getAction();
        //System.out.println("ACTION: "+action);
        switch (action){
            case ACTION_START:
                startingService(intent.getIntExtra("valueStart",0));
                break;
            case ACTION_DO_SOMETHING_1:
                int value1,value2;
                value1=intent.getIntExtra("value1",0);
                value2=intent.getIntExtra("value2",0);
                doSomething1(value1,value2);
                break;
            case ACTION_DO_SOMETHING_2:
                value1=intent.getIntExtra("value1",0);
                value2=intent.getIntExtra("value2",0);
                doSomething2(value1,value2);
                break;
            case ACTION_STOP_SERVICE:
                stopService();
                break;
        }
        return START_STICKY;
    }

    public void startingService(int value){
        //calling when start
    }

    public void doSomething1(int value1, int value2){
        //...
    }

    public void doSomething2(int value1, int value2){
        //...
    }

    public void stopService(){
        //...destroy/release objects
        stopself();
    }
}

活動中:

public void startService(int value){
    Intent myIntent = new Intent(SampleService.ACTION_START);
    myIntent.putExtra("valueStart",value);
    startService(myIntent);
}

public void serviceDoSomething1(int value1, int value2){
    Intent myIntent = new Intent(SampleService.ACTION_DO_SOMETHING_1);
    myIntent.putExtra("value1",value1);
    myIntent.putExtra("value2",value2);
    startService(myIntent);
}

public void serviceDoSomething2(int value1, int value2){
    Intent myIntent = new Intent(SampleService.ACTION_DO_SOMETHING_2);
    myIntent.putExtra("value1",value1);
    myIntent.putExtra("value2",value2);
    startService(myIntent);
}

public void endService(){
    Intent myIntent = new Intent(SampleService.STOP_SERVICE);
    startService(myIntent);
}

最後に、マニフェストファイルで:

<service Android:name=".SampleService">
    <intent-filter>
        <action Android:name="com.yourcompany.yourapp.SampleService.ACTION_START"/>
        <action Android:name="com.yourcompany.yourapp.SampleService.DO_SOMETHING_1"/>
        <action Android:name="com.yourcompany.yourapp.SampleService.DO_SOMETHING_2"/>
        <action Android:name="com.yourcompany.yourapp.SampleService.STOP_SERVICE"/>
    </intent-filter>
</service>
5
Carlos Gómez

アクティビティ:

int number = 5;
Intent i = new Intent(this, MyService.class);
i.putExtra("MyNumber", number);
startService(i);

サービス:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent != null && intent.getExtras() != null){
        int number = intent.getIntExtra("MyNumber", 0);
    }
}
2
vishalknishad

これは、はるかに優れた安全な方法です。魅力のように働く!

   private void startFloatingWidgetService() {
        startService(new Intent(MainActivity.this,FloatingWidgetService.class)
                .setAction(FloatingWidgetService.ACTION_PLAY));
    }

の代わりに :

 private void startFloatingWidgetService() {
        startService(new Intent(FloatingWidgetService.ACTION_PLAY));
    }

2つ目を試すと、Java.lang.IllegalArgumentException:Service Intentを明示的に指定する必要があるというエラーが表示されるためです:Intent {act = com.floatingwidgetchathead_demo.SampleService。 ACTION_START}

次に、サービスは次のようになります。

static final String ACTION_START = "com.floatingwidgetchathead_demo.SampleService.ACTION_START";
    static final String ACTION_PLAY = "com.floatingwidgetchathead_demo.SampleService.ACTION_PLAY";
    static final String ACTION_PAUSE = "com.floatingwidgetchathead_demo.SampleService.ACTION_PAUSE";
    static final String ACTION_DESTROY = "com.yourcompany.yourapp.SampleService.ACTION_DESTROY";

 @SuppressLint("LogConditional")
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    String action = intent.getAction();
    //System.out.println("ACTION: "+action);
    switch (action){
        case ACTION_START:
            Log.d(TAG, "onStartCommand: "+action);
            break;
        case ACTION_PLAY:
            Log.d(TAG, "onStartCommand: "+action);
           addRemoveView();
           addFloatingWidgetView();
            break;
        case ACTION_PAUSE:
            Log.d(TAG, "onStartCommand: "+action);
            break;
        case ACTION_DESTROY:
            Log.d(TAG, "onStartCommand: "+action);
            break;
    }
    return START_STICKY;

}
1
Debasish Ghosh

サービス:startserviceは、副作用を引き起こす可能性があります。メッセンジャーを使用してデータを渡す最良の方法です。

private CallBackHandler mServiceHandler= new CallBackHandler(this);
private Messenger mServiceMessenger=null;
//flag with which the activity sends the data to service
private static final int DO_SOMETHING=1;

private static class CallBackHandler extends Android.os.Handler {

private final WeakReference<Service> mService;

public CallBackHandler(Service service) {
    mService= new WeakReference<Service>(service);
}

public void handleMessage(Message msg) {
    //Log.d("CallBackHandler","Msg::"+msg);
    if(DO_SOMETHING==msg.arg1)
    mSoftKeyService.get().dosomthing()
}
}

アクティビティ:インテントからメッセンジャーを取得し、データを渡し、メッセージをサービスに戻します

private Messenger mServiceMessenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
mServiceMessenger = (Messenger)extras.getParcelable("myHandler");
}


private void sendDatatoService(String data){
Intent serviceIntent= new 
Intent(BaseActivity.this,Service.class);
Message msg = Message.obtain();
msg.obj =data;
msg.arg1=Service.DO_SOMETHING;
mServiceMessenger.send(msg);
}
0
surya

アクティビティからIntentServiceにデータを渡す

これが、ActivityからIntentServiceにデータを渡す方法です。

application の1つにこのシナリオがあります。

MusicActivity ------ url(String)------> DownloadSongService

1)データ送信(アクティビティコード)

_  Intent intent  = new Intent(MusicActivity.class, DownloadSongService.class);
  String songUrl = "something"; 
  intent.putExtra(YOUR_KEY_SONG_NAME, songUrl);
  startService(intent);
_

2)サービスのデータを取得する(IntentServiceコード)
onHandleIntent()メソッドでインテントにアクセスできます

_public class DownloadSongService extends IntentService {

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {

        String songUrl = intent.getStringExtra("YOUR_KEY_SONG_NAME");

        //  Download File logic

    }

}
_
0
Rohit Singh