使用IntentService下载数据 - 生命周期更改

时间:2014-04-29 11:12:06

标签: android android-service

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是否正在运行。尽管这可能有效,但明确指出该方法适用于调试或实现服务管理类型用户界面

2 个答案:

答案 0 :(得分:1)

使用sendStickyBroadcast发送粘性广播。该广播由系统保存。

答案 1 :(得分:0)

通过使用SharedPreferences,静态变量和其他“hacky”解决方案,我并不是真的相信。

但我确实发现你可以提供ResultReceiver - 这是可以分配的 - 你可以用它来通知你的任务已经完成。它接收Handler以指定处理结果的线程。

这样做的好处是,您可以在ResultReceiver期间保存onSaveInstanceState。使用一些聪明的技巧,你当然可以使这项工作。我创建了一个实验库来促进这种策略:https://github.com/nhaarman/Ergo