Tl;dr How to know when an IntentService
has finished downloading upon returning to the Activity
which listens to its result using a BroadcastReceiver
?
I'm moving to implementing data downloading to IntentService
s, and notifying when the task has finished using BroadcastReceiver
s.
I generally start the service in my Activity
:
IntentFilter intentFilter = DownloadDataService.startDownloadData(this);
getLocalBroadcastManager().registerReceiver(mBroadcastReceiver, intentFilter);
The part that starts the Service
:
/**
* Starts the service and returns an IntentFilter to subscribe a BroadcastReceiver on.
* When the task has finished, a broadcast for returned IntentFilter is sent,
* containing downloaded data.
*/
public static IntentFilter startDownloadData(final Context context) {
Intent intent = new Intent(context, DownloadDataService.class);
intent.setAction(ACTION_DOWNLOAD_DATA);
context.startService(intent);
return new IntentFilter(ACTION_DOWNLOAD_DATA);
}
And of course, onHandleIntent(Intent)
(simplified):
@Override
protected void onHandleIntent(final Intent intent){
Data data = downloadData();
Intent intent = new Intent(ACTION_DOWNLOAD_DATA);
intent.putExtra(DATA, data);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
This all works well, and I can keep states in my Activity
to know for example after an orientation change whether I was waiting for a download data result:
@Override
public void onResume(){
super.onResume();
if (mState == State.DOWNLOADING) {
Log.v(TAG, "Registering receiver for existing download data");
IntentFilter intentFilter = DownloadDataService.getIntentFilter();
getLocalBroadcastManager().registerReceiver(mBroadcastReceiver, intentFilter);
}
}
Great, now I can also handle orientation changes. Only one problem left:
Activity
starts theDownloadDataService
- User moves away from the
Activity
DownloadDataService
broadcasts its done message (which is not received by theActivity
due tounregisterReceiver
inonStop()
)- User moves back into the
Activity
Activity
still thinks it's waiting for theDownloadDataService
, and does nothing.
How can I compensate for this?
Note that I do not have any persistence like databases for storing the downloaded data. The Activity
retrieves the data from the broadcasted Intent
.
Note #2: There is this answer to the question of how to know whether a Service
is running. Although this might work, it is explicitly stated that that method is for debugging or implementing service management type user interfaces.