Android - 服务还是 IntentService?

Android - Service or IntentService?

我有一个应用程序 运行 在 打开 或设备 启动时 [=] 某些 "long" 进程48=].

该进程通过下载管理器执行一定数量的下载,并在该进程完成后向应用程序发送一个广播事件,以捕获一些分析。

据我所知,每当启动广播事件被调用时,Application class 就会被实例化(如果不在内存中的话)。

Application class在用户打开应用时也会启动

基于此,运行 过程的代码放在 Application class 的 onCreate 方法中。 (进程从那里启动一个新线程)

然而,似乎 "long" 进程占用的时间超过了引导广播接收器的生存时间(大约 10 秒?),因此应用程序进程被终止。然后几秒钟后,下载完成后发送第二个广播,应用程序再次启动,再次调用 Application.onCreate,产生了一些不良影响。

进程预计以单一线性方式 运行 并且不会再次调用 onCreate

因为这个过程只发生一次,我正在考虑创建一个 Service 来给应用程序更多的时间来保持活力。但是这个过程依赖于 DownloadManager 所以:

1) 使用 IntentService 将不起作用(据我了解),因为该进程在 handleIntent return 秒后仍被终止。该进程创建新线程,因此其任务是异步的,并且 handleIntent 方法将在整个进程完成之前 return。

2) 我应该创建一个 Service 只是 'alive' 一段时间然后在过程完成后停止吗?

3) 作为附加问题,如果我有一个 运行ning ServiceApplication class 是否会被实例化并保存在内存中,直到服务停止?

你仍然可以使用 Intent 服务,你只需要在后台任务 运行 时阻塞。实现可以像这样工作:

放在服务中,IntentService 可以这样工作:

 public class DownloadIntentService extends IntentService { 

  @Override
  protected void onHandleIntent(Intent intent) {
     //get url or whatever from intent
     //kick off async code to start the download, something like eg:
      DownloadTask downloadTask = new DownloadTask(url);
      downloadTask.setListener(new Listener() {
          public void onComplete(Download download) {
              DownloadIntentService.this.notify();
          }
       }
       downloadTask.start()
       wait();

  }

如果您只执行一次,您应该创建自己的 Service。当您的应用程序启动时,请调用 startService()。在你的 ServiceonStartCommand() 中,启动一个背景 Thread 来做你想做的事和 return START_STICKY(这让你的 Service 运行 直到你停止它)。 Thread 完成后,在 Service.

上调用 stopSelf()

当然,您可以使用IntentService,但class只是Service的扩展,为您提供了另一层便利。 IntentService 管理一个后台线程池,并在 Service 工作用完时负责启动和停止它。这对于您的需要来说可能有点矫枉过正,但是如果您愿意,请继续使用它。这里的权衡可以忽略不计。

注意:<opinion>出于某种原因,许多开发人员似乎喜欢某些 "fad" 解决方案,例如 AsyncTaskIntentService 和事件总线。还有很多其他方法可以解决问题。软件开发没有"one size fits all"</opinion>