JobIntentService 的 onDestroy 被调用后会发生啥?

Posted

技术标签:

【中文标题】JobIntentService 的 onDestroy 被调用后会发生啥?【英文标题】:What happens after JobIntentService's onDestroy is called?JobIntentService 的 onDestroy 被调用后会发生什么? 【发布时间】:2019-09-14 11:38:37 【问题描述】:

我有一个与JobIntentService 的生命周期相关的问题。从文档中,我发现JobIntentServiceonHandleWork(Intent intent) 返回后立即被销毁。 onHandleWork 在后台运行,所以我可以在这里运行阻塞操作。那么,如果我想异步运行实际执行会发生什么?我似乎一切都按预期运行,但很难理解即使在调用onDestroy 之后服务仍在后台运行。下面是我对onHandleWork的实现。

override fun onHandleWork(intent: Intent) 
    if (!processor.isProcessing) 
        subscription.add(processor.startProcessing()
                .subscribe(
                    // Do something
                ,  t ->
                    t.printStackTrace()
                    // Do something
                ))
    

当服务实际上被“销毁”时,这实际上是如何在后台运行的?

【问题讨论】:

【参考方案1】:

onHandleWork 方法执行你的逻辑,如果你的逻辑启动异步任务,JobIntentService 告诉自己你给它的任务被执行(你给它的任务是简单地执行一个异步任务)因此你收到@ 987654323@立即

如果onHandleWork 直接执行您的逻辑(包括一个长流程),那么您的流程完成后将立即调用onDestroy()

要完全理解差异,您需要知道onHandleWork 方法只是执行您的逻辑。

例子:

1 - onHandleWork-> Asynctask.execute() -> onDestroy()

2 - onHandleWork-> for 循环 -> onDestroy()

在(1-)上你告诉onHandleWork方法执行一个异步任务,但不继续跟踪进程的进度,onHandlework执行.execute()(只需要几毫秒)

在 (2-) 上,您告诉 onHandleWork 方法执行一个循环,这会阻止调用 onDestroy() 直到您的循环结束。

【讨论】:

以上是关于JobIntentService 的 onDestroy 被调用后会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

JobIntentService 的 onDestroy 被调用后会发生啥?

JobIntentService - onHandleWork 并不总是被调用?

JobIntentService 不调用 OnHandleWork

JobIntentService 不会在 Android 8.0 上立即启动

Proguard:JobIntentService IllegalArgumentException启用模糊处理

在 JobIntentService 中可以在没有 onHandleWork() 的情况下调用 onDestroy() 吗?