I am quite new to Android dev and struggling with with the concept of bound services
I have bound a service to an Activity in the onCreate method of the activity
startService(intent);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
mConnection is a ServiceConnection object for which I have overridden the onServiceConnected callback method in an anonymous class
In the callback, mService (which is a class member of type LibraryService, LibraryService is my subclass of Service) is set to reference the LibraryService object we are binding to:
mService = binder.getService();
I thought that after the call to bindService in onCreate I would then be able to call the LibraryService through mService reference, but it is still set to null at this point indicating that the onServiceConnected callback has not been executed.
I have tried to print the value of a string generated by an mService method using Log:
if (mService != null) {
Log.d(LOG_TAG, "In onCreate getLogFileName string value: " + mService.getLogFileName("pulse"));
} else {
Log.d(LOG_TAG, "In onCreate getLogFileName string value: null");
}
as I mentioned – it was still null in onCreate, I then added the same log code to onStart and onResume but mService is still null
My question is when does that callback get executed? I would have thought it would have to occur within the body of the onCreate method but clearly not. I think I need a few pointers in how/when callbacks are executed by the Android system
I know the callback does get executed as I have put a breakpoint on the statement where mService is instantiated and it hits that statement. I just don’t understand when its occuring, i.e. how do I know when its OK to assume mService has been set? Can I only access it within the body of the OnServiceConnected callback?
Service binding is asynchronus and, as such, you have to handle this with a little of synchronization.
Hence, after calling bind service you could do something like
in onServiceConnected:
Note that is good putting that wait in an asyncTask, so that ui does not get frozen.