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
,因为它具有一些漂亮的功能。