23

EventBus我可以使用这个库进行 Activity 到服务的通信吗?

我在我的应用程序中尝试过如下:

@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调用

4

2 回答 2

30

您必须注册订阅者,而不是发射者。

因此,如果您确实希望获得该事件,请从您的应用程序中删除注册/取消注册。如果是这样,只需将onEvent(AnyEvent event) 方法添加到 Application 类。

然后在您的服务中注册 EventBusonStart()并在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
  }
  ...
}
于 2015-10-27T15:35:07.187 回答
5

就我而言,zyamys的评论有所帮助。此外,由于代码错误, Anthony的回答是正确的。

如果您使用不同的过程,答案是否定的。如果您使用不同的进程,则意味着它在不同的虚拟机(如 Davlik)上运行。所有静态字段都不一样...!示例(AndroidManifest.xml):

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

如果您在同一进程中运行服务,答案是YES。示例(AndroidManifest.xml):

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

在第一种情况下,我建议结合使用 Intent 和发送/接收广播功能在服务和活动之间发送数据。

于 2018-03-27T10:29:13.133 回答