我有一个IntentService
,如下所示,它执行了一些可排队的长时间运行的任务,这些任务不应被杀死。我使用的是IntentService
而不是Service
,因为IntentService
处理希望的传入意图的线程和排队。为了使服务保持运行状态,我获取了唤醒锁并将服务设置为setForeground(int, Notification)
中的onCreate()
为前台,在onDestroy()
中相反,我释放了这些资源。
不幸的是,虽然在第一次创建onCreate()
时总是调用IntentService
,但偶尔会调用onDestroy()
。到目前为止,我发现onDestroy()
仅在我运行应用程序的主要活动时才被调用。删除活动(关闭窗口)并锁定电话后,分配给服务的任务将继续完成,但是从未调用onDestroy()
,导致唤醒锁定和通知持续存在。
这是我的IntentService
所拥有的:
public class BackupBackgroundService extends IntentService {
// ...variables
public BackupBackgroundService() {
super("BackupBackgroundService");
setIntentRedelivery(true);
}
private NotificationCompat.Builder getNotification(String id) { /* ... */ }
@Override
public void onCreate() {
super.onCreate();
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Syncopoli: Sync wakelock");
wakeLock.acquire(20 * 60 * 1000); // timeout in millis
Notification notif = /* ... */;
startForeground(App.SYNC_NOTIF_ID, notif);
}
@Override
public void onDestroy() {
stopForeground(true);
wakeLock.release();
super.onDestroy();
}
@Override
protected void onHandleIntent(Intent work) {
/* do time-intensive task in blissful ignorance */
}
}
为简洁起见,我排除了部分内容。
我现在的问题是:在与onHandleIntent
一起工作时,我如何才能分别可靠地获取和释放IntentService
之前和之后的资源?
针对此问题,我想到了两种解决方案:
1.在onHandleIntent
的开头获取资源,并在结尾释放资源,然后让android随意销毁该服务。
2.通过直接使用IntentService
重新实现Service
,并在其顶部添加生命周期管理部分。
我希望有一种比不断重新获取资源和重新实现IntentService
更好的方法。