我可以将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
中致电。
答案 0 :(得分:24)
您必须注册订阅者,而不是注册者。
因此,如果您希望获得该活动,请从您的应用中删除注册/取消注册。如果是这样,只需将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
}
...
}
答案 1 :(得分:2)
在我的案例中, zyamys 的评论有所帮助。另外,由于代码中的错误, Anthony 的答案是正确的。
如果您使用其他流程,则答案为否。如果您使用不同的进程,则意味着它在不同的虚拟机(如Davlik)上运行。所有静态字段都不同......! 示例(AndroidManifest.xml):
<service android:name=".GPSTracker" android:process=":my_gps_tracker" />
如果您在同一过程中运行服务,则答案为是。示例(AndroidManifest.xml):
<service android:name=".GPSTracker"/>
在第一种情况下,我建议将Intents与发送/接收广播功能结合使用,以便在服务和活动之间发送数据。