web-dev-qa-db-ja.com

アクティビティとサービス間の通信にgreenrobot EventBusを使用できますか?

サービス通信に関して、 EventBus ライブラリをアクティビティとして使用できますか?

私は次のように私のアプリでこれを試しました:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  EventBus.getDefault().register(this);
  setContentView(R.layout.activity_music_player);
  Intent serviceIntent=new Intent(MusicPlayerActivityTest.this,MusicPlayerServiceTest.class);
  startService(serviceIntent);
  EventBus.getDefault().post(new SetSongList(songArraList, 0));
}

@Override
protected void onDestroy() {
  EventBus.getDefault().unregister(this);
  super.onDestroy();
}

そして私のサービスでonEventが呼ばれました。

19
Bincy Baby

エミッタではなく、サブスクライバを登録する必要があります。

したがって、イベントを取得する予定がある場合は、アプリから登録/登録解除を削除してください。その場合は、onEvent(AnyEventイベント)メソッドをApplicationクラスに追加するだけです。

次に、onStart()でサービスにEventBusを登録し、onStop()で登録を解除します。

それならもっとうまくいくはずです。

アプリケーション内

public class MyApp extend Application {
  @Override
  public void onCreate() {
    super.onCreate();
    ...
    EventBus.getDefault().post(new SetSongList(songArraList, 0));
  }
}

またはアクティビティ内

public class MyActivity extend Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    EventBus.getDefault().post(new SetSongList(songArraList, 0));
  }
}

およびサービス内

public class MyService extends Service {
  ...
  @Override
  public void onCreate() {
    super.onCreate();
    EventBus.getDefault().register(this);
  }

  @Override
  public void onDestroy() {
    EventBus.getDefault().unregister(this);
    super.onDestroy();
  }

  public void onEvent(SetSongList event){
    // do something with event
  }
  ...
}
25
Anthony

私の場合、zyamysによるコメントが役に立ちました。また、Anthonyでの回答は、コードの誤りのために正しいです。

別のプロセスを使用する場合、答えは[〜#〜] no [〜#〜]です。別のプロセスを使用する場合は、別の仮想マシン(Davlikなど)で実行されることを意味します。すべての静的フィールドは異なります...!例(AndroidManifest.xml):

<service Android:name=".GPSTracker" Android:process=":my_gps_tracker" />

同じプロセスでサービスを実行すると、答えは[〜#〜] yes [〜#〜]になります。例(AndroidManifest.xml):

<service Android:name=".GPSTracker"/>

最初のケースでは、インテントを送信/受信ブロードキャスト機能と組み合わせて使用​​して、サービスとアクティビティの間でデータを送信することをお勧めします。

3
MatejC