活动关闭时未调用IntentService.onDestroy()

时间:2019-07-10 01:55:07

标签: java android

我有一个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更好的方法。

0 个答案:

没有答案