Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I use greenrobot EventBus for Communication between Activity and Service?

Tags:

EventBus Can I use this library for Activity to Service communication ?

I have tried this in my app as follows:

@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(); } 

and in my service onEvent called

like image 904
Bincy Baby Avatar asked Sep 28 '15 19:09

Bincy Baby


People also ask

What is EventBus used for?

EventBus is an open-source library for Android and Java using the publisher/subscriber pattern for loose coupling. EventBus enables central communication to decoupled classes with just a few lines of code – simplifying the code, removing dependencies, and speeding up app development.


2 Answers

You have to register the Subscriber, not the emitter.

So, remove register/unregister from your app if you do expect to get the event. If so, just add the onEvent (AnyEvent event) method to the Application class.

Then register EventBus in your service in onStart() and unregister in onStop().

It should work better then.

In your Application

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

or in your Activity

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

and in your Service

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   }   ... } 
like image 54
Anthony Avatar answered Oct 02 '22 14:10

Anthony


In my case comment by zyamys helped. Also, answer by Anthony is correct because of mistake in code.

In case you use a different process, the answer is NO. If you use different process it means it runs on a different virtual machine (like Davlik). All static fields are different...! Example (AndroidManifest.xml):

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

If you run service in the same process answer is YES. Example (AndroidManifest.xml):

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

In the first case, I suggest of using Intents in combination with send/receive broadcast functionality to send data between service and activity.

like image 43
MatejC Avatar answered Oct 02 '22 14:10

MatejC