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 Service
,Application
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()
。在你的 Service
的 onStartCommand()
中,启动一个背景 Thread
来做你想做的事和 return START_STICKY
(这让你的 Service
运行 直到你停止它)。 Thread
完成后,在 Service
.
上调用 stopSelf()
当然,您可以使用IntentService
,但class只是Service
的扩展,为您提供了另一层便利。 IntentService
管理一个后台线程池,并在 Service
工作用完时负责启动和停止它。这对于您的需要来说可能有点矫枉过正,但是如果您愿意,请继续使用它。这里的权衡可以忽略不计。
注意:<opinion>
出于某种原因,许多开发人员似乎喜欢某些 "fad" 解决方案,例如 AsyncTask
、IntentService
和事件总线。还有很多其他方法可以解决问题。软件开发没有"one size fits all"</opinion>
我有一个应用程序 运行 在 打开 或设备 启动时 [=] 某些 "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 Service
,Application
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()
。在你的 Service
的 onStartCommand()
中,启动一个背景 Thread
来做你想做的事和 return START_STICKY
(这让你的 Service
运行 直到你停止它)。 Thread
完成后,在 Service
.
stopSelf()
当然,您可以使用IntentService
,但class只是Service
的扩展,为您提供了另一层便利。 IntentService
管理一个后台线程池,并在 Service
工作用完时负责启动和停止它。这对于您的需要来说可能有点矫枉过正,但是如果您愿意,请继续使用它。这里的权衡可以忽略不计。
注意:<opinion>
出于某种原因,许多开发人员似乎喜欢某些 "fad" 解决方案,例如 AsyncTask
、IntentService
和事件总线。还有很多其他方法可以解决问题。软件开发没有"one size fits all"</opinion>