Access data members of background service
I have an Activity communicating with and directly accessing a background Service's data members through get functions. The problem is that I can't seem to be able to access the actual data members. For instance, I try and get an ArrayList with a few items in it but I just receive an empty ArrayList.
This code is almost directly from the local service tutorial in the Android Service class doc.
Here's my service: CommunicationService
public static final String BROADCAST_ALARM = "Alarm";
private Intent mAlarmBroadcast = new Intent(BROADCAST_ALARM);
private AlarmList mAlarms;
class TempTask extends AsyncTask<String, Void, Void> {
private int id = 0;
@Override
protected Void doInBackground(String... params) {
while (true) {
mAlarms.addAlarm(++id, "Description", "Label");
sendBroadcast(mAlarmBroadcast);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
@Override
public void onCreate() {
super.onCreate();
mAlarms = new AlarmList();
new TempTask().execute("test");
}
public AlarmList getAlarmList() {
return mAlarms;
}
And here's my bound activity:
private CommunicationService mComService = null;
private IconicAdapter mListAdapter;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.alarm_list);
mListAdapter = new IconicAdapter(this, R.layout.row, R.id.label);
setListAda开发者_如何学Pythonpter(mListAdapter);
// Attempt to bind with the service.
bindService(new Intent(this, CommunicationService.class), mOnService, BIND_AUTO_CREATE);
}
/*
* Receives broadcasts from the bound service.
*/
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action != null) {
if (action.equals(CommunicationService.BROADCAST_ALARM)) {
AlarmList alarmList = mComService.getAlarmList();
ArrayList<Alarm> alarms = alarmList.getAllAlarms();
/* THIS IS WHERE THE PROBLEM EXISTS.
* alarms is an ArrayList of size 0, where as if you break
* over the actual data member in the service class, it is
* full of elements.
*/
mListAdapter.addAll(alarms);
}
}
}
};
private ServiceConnection mOnService = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
mComService = ((CommunicationService.LocalBinder) binder).getService();
appendAlarms();
}
@Override
public void onServiceDisconnected(ComponentName name) {
// This is called when the connection with the service has been
// unexpectedly disconnected -- that is, its process crashed.
mComService = null;
}
};
Thought I would answer this just in case there were other people in the same situation.
I fixed this by using the
startService(Intent intent);
method before binding to it. If only bindService(...) is used to start a service, the service will be destroyed once there are no bound activities or other services attached to it. Using startService(...) allows the service to exist without any bindings.
This is exactly what was happening in my program; I was calling unbindService(...) in the onDestroy() method of my Activity and then binding again using bindService(...) in the onStart() method on the next Activity. Hence, each Activity I was launching was starting a stopping a brand new service.
精彩评论