Android-服务还是IntentService?

Android-服务还是IntentService?,android,multithreading,android-service,intentservice,android-application-class,Android,Multithreading,Android Service,Intentservice,Android Application Class,我有一个应用程序,当它打开时,或者当设备启动时,它会运行某些“长”进程 该过程通过下载管理器执行一定量的下载,当该过程完成时,它会向应用程序发送一个广播事件,以捕获一些分析 据我所知,无论何时调用启动广播事件,都会显示应用程序类(如果尚未在内存中) 应用程序类也会在用户打开应用程序时启动 基于此,运行进程的代码被放置在应用程序类的onCreate方法中。(进程从此处启动一个新线程) 然而,“长”进程似乎比启动广播接收器的生存时间要长(大约10秒?),因此应用程序进程被终止。几秒钟后,下载完成后,

我有一个应用程序,当它打开时,或者当设备启动时,它会运行某些“长”进程

该过程通过下载管理器执行一定量的下载,当该过程完成时,它会向应用程序发送一个广播事件,以捕获一些分析

据我所知,无论何时调用启动广播事件,都会显示
应用程序
类(如果尚未在内存中)

应用程序
类也会在用户打开应用程序时启动

基于此,运行进程的代码被放置在
应用程序
类的
onCreate
方法中。(进程从此处启动一个新线程)

然而,“长”进程似乎比启动广播接收器的生存时间要长(大约10秒?),因此应用程序进程被终止。几秒钟后,下载完成后,发送第二次广播,再次启动应用程序调用
Application.onCreate
,产生一些不良效果

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

由于这个过程只发生一次,我正在考虑创建一个
服务
,让应用程序有更多的时间保持活力。但是,该过程取决于DownloadManager,因此:

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

2) 我是否应该创建一个
服务
,它只是“活动”一段时间,然后在流程完成后停止


3) 另外一个问题是,如果我有一个正在运行的
服务
,那么
应用程序
类是否会被实例化并保存在内存中,直到服务停止?

您仍然可以使用意图服务,只需在后台任务运行时进行阻止。实施过程可以如下所示:

将其放在服务中,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();

  }

如果只执行一次,则只需创建自己的
服务
。应用程序启动时,请调用
startService()
。在
服务的
onStartCommand()
中,启动执行所需操作的后台
线程
,并返回
start\u STICKY
(这将使
服务一直运行,直到您停止它)。当
线程
完成时,在
服务
上调用
stopSelf()

当然,您可以使用
IntentService
,但该类只是
Service
的扩展,为您提供了另一层便利
IntentService
管理后台线程池,并在
服务
用完时启动和停止该服务。对于你所需要的东西来说,这可能是矫枉过正,但是如果你想的话,就去使用它吧。这里的权衡可以忽略不计


注意:
出于某种原因,许多开发人员似乎喜欢某些“fad”解决方案,如
AsyncTask
IntentService
和事件总线。解决问题还有很多其他方法。在软件开发中没有“一刀切”的方法。

您是否阻止了您的BroadcastReceive的
onReceive
方法超过10秒?@waqaslam不,BroadcastReceiver对此过程完全不做任何事情,该过程是从应用程序类管理的。我建议您在BroadcastReceive的
onReceive
内部生成一个
IntentService
,而不是在应用程序的
onCreate
中进行。这样做不会占用主UI线程,因为IntentService在后台线程上运行。此外,(作为替代)您还可以使用
JobScheduler
,因为它具有一些漂亮的功能。