Tl; dr 如何知道IntentService
在返回使用Activity
监听其结果的BroadcastReceiver
后何时完成下载?
我正在实施数据下载到IntentService
,并在任务完成时使用BroadcastReceiver
通知。
我通常在Activity
:
IntentFilter intentFilter = DownloadDataService.startDownloadData(this);
getLocalBroadcastManager().registerReceiver(mBroadcastReceiver, intentFilter);
启动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);
}
当然,onHandleIntent(Intent)
(简化):
@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);
}
这一切都运行良好,我可以在我的Activity
中保持状态,例如在方向更改后知道我是否在等待下载数据结果:
@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);
}
}
太好了,现在我也可以处理方向变化了。只留下一个问题:
Activity
启动DownloadDataService
Activity
DownloadDataService
广播其已完成的消息(由于Activity
中的unregisterReceiver
onStop()
未收到该消息Activity
Activity
仍然认为它正在等待DownloadDataService
,并且什么也没做。我该如何弥补这个?
请注意,我没有像数据库这样的持久性来存储下载的数据。 Activity
检索广播的Intent
。
注意#2:this answer问题是如何知道Service
是否正在运行。尽管这可能有效,但明确指出该方法适用于调试或实现服务管理类型用户界面。
答案 0 :(得分:1)
使用sendStickyBroadcast发送粘性广播。该广播由系统保存。
答案 1 :(得分:0)
通过使用SharedPreferences,静态变量和其他“hacky”解决方案,我并不是真的相信。
但我确实发现你可以提供ResultReceiver
- 这是可以分配的 - 你可以用它来通知你的任务已经完成。它接收Handler
以指定处理结果的线程。
这样做的好处是,您可以在ResultReceiver
期间保存onSaveInstanceState
。使用一些聪明的技巧,你当然可以使这项工作。我创建了一个实验库来促进这种策略:https://github.com/nhaarman/Ergo