Is there anything wrong with this way of trigger an action in an Activity
from a local Service? It seems too easy. But all the examples I have seen
of accomplishing the same end use a more complicated Messenger method.
Anyway, here is what I do:
In my activity, I start and bind to a local Service (BTService) from
onResume:
Intent intent = new Intent(this, BTService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
startService(intent);
The "mConnection" referenced above is defined by:
/** Defines callbacks for service binding, passed to bindService() **/
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
// We've bound to LocalService, cast the IBinder and get BTService
instance
MyBtServiceBinder binder = (MyBtServiceBinder) service;
btserv = binder.getService(); //..Activity's reference to the
Service
btserv.main = Main.this; //..Service's reference to the
binding Activity
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
if(btserv != null)
{
btserv.main = null; //..Break the Service's reference to the
Activity
btserv = null; //..Break the Activity's reference to the
Service
}
}
};
In my Activity's onPause I disconnect from the Service as follows:
if (btserv!=null) {
btserv.main = null; //..Break the Service's reference to the
Activity
btserv = null; //..Break the Activity's reference to the
Service
unbindService(mConnection);
}
So when the Service wants to trigger an event in the Activity, it does this:
if(main != null)
{
main.handler.post(main.doHandleEvent);
}
Where "main" is the reference to my Activity that was set by the Activity
in "onServiceConnected", and "handler" is a Handler in my Activity that
handles posts to the Runnable, "doHandleEvent". Then in short order, the
doHandleEvent in my Activity will run. And that is how I trigger an event
in the Activity from my Service. Of course there are many assumptions in
this approach. For example, only one client should connect to my Service,
since it only holds a single reference to the client. And the triggering
shown above is from the UI thread, not from a worker thread. That gets
around the race condition where "main" is not null at the "if" statement,
but becomes null by the time the thread gets into the referencing of
handler and doHandleEvent. I have tested this method in a Bluetooth
application and everything seems to be working fine. But I want to know if
there is some "gotcha" that I have not seen.
Robert Scott
Hopkins, MN
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
---
You received this message because you are subscribed to the Google Groups
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.