我可以使用 greenrobot EventBus 在 Activity 和服务之间进行通信吗?
Can I use greenrobot EventBus for Communication between Activity and Service?
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
被称为
您必须注册订阅者,而不是发射器。
因此,如果您确实希望获得该活动,请从您的应用中删除 register/unregister。如果是这样,只需将 onEvent
(AnyEvent 事件)方法添加到应用程序 class.
然后在 onStart()
中在您的服务中注册 EventBus,并在 onStop()
中注销。
到时候应该效果会更好。
在您的申请中
public class MyApp extend Application {
@Override
public void onCreate() {
super.onCreate();
...
EventBus.getDefault().post(new SetSongList(songArraList, 0));
}
}
或在您的 Activity
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
}
...
}
就我而言,zyamys 的评论对我有所帮助。另外,由于代码错误,Anthony 的回答是正确的。
如果您使用不同的进程,答案是否。如果您使用不同的进程,则意味着它 运行 在不同的虚拟机(如 Davlik)上。所有的静态字段都是不同的...!
示例(AndroidManifest.xml):
<service android:name=".GPSTracker" android:process=":my_gps_tracker" />
如果您 运行 在同一进程中提供服务,则答案是 YES。示例(AndroidManifest.xml):
<service android:name=".GPSTracker"/>
在第一种情况下,我建议结合使用 Intents 和 send/receive 广播功能在服务和 activity 之间发送数据。
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
被称为
您必须注册订阅者,而不是发射器。
因此,如果您确实希望获得该活动,请从您的应用中删除 register/unregister。如果是这样,只需将 onEvent
(AnyEvent 事件)方法添加到应用程序 class.
然后在 onStart()
中在您的服务中注册 EventBus,并在 onStop()
中注销。
到时候应该效果会更好。
在您的申请中
public class MyApp extend Application {
@Override
public void onCreate() {
super.onCreate();
...
EventBus.getDefault().post(new SetSongList(songArraList, 0));
}
}
或在您的 Activity
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
}
...
}
就我而言,zyamys 的评论对我有所帮助。另外,由于代码错误,Anthony 的回答是正确的。
如果您使用不同的进程,答案是否。如果您使用不同的进程,则意味着它 运行 在不同的虚拟机(如 Davlik)上。所有的静态字段都是不同的...! 示例(AndroidManifest.xml):
<service android:name=".GPSTracker" android:process=":my_gps_tracker" />
如果您 运行 在同一进程中提供服务,则答案是 YES。示例(AndroidManifest.xml):
<service android:name=".GPSTracker"/>
在第一种情况下,我建议结合使用 Intents 和 send/receive 广播功能在服务和 activity 之间发送数据。