I am trying to bind service from another service like this:
public class ServiceA extends Service {
private ServiceB mDataService;
private boolean mIsBound;
@Override
public void onCreate(){
super.onCreate();
doBindService();
/* ... */
}
@Override
public void onStart(final Intent intent, final int startId){
/*...*/
}
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
mDataService = ((ServiceB.LocalBinder)service).getService();
}
public void onServiceDisconnected(ComponentName className) {
mDataService = null;
}
};
void doBindService() {
bindService(new Intent(ServiceA.this, ServiceB.class), mConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
}
void doUnbindService() {
if (mIsBound) {
unbindService(mConnection);
mIsBound = false;
}
}
}
This is a simple snippet that I took from goolge's samples :)
The code works just fine and mDataService holds a reference to ServiceB instance, but there is one thing I could not understand: the onServiceConnected
callback is called after the call to onStart
. As I saw on android's docs, the callback is running on the main thread - but can I count on it that it will ALWAYS happen in this order in my case? onCreate -> onStart -> onServiceConnected ?
I wouldn't rely on it. It depends if ServiceA and ServiceB are running in the same or in different processes. It probably also depends if ServiceB has already been started. You should write your code so that you don't depend on this sequence of events.
It hasn't been clearly stated in the official dev guide, the Context.bindService() is indeed an asynchronous call, this also explain why ServiceConnection.onServiceConnected() is implemented as a callback. Check out the dev guide:
ServiceConnection.onServiceConnected() is called on UI thread at some point in the future (not immediately after calling Context.bindService()), once connection to service is properly established.