onTaskRemoved()在Android 8.0 Oreo API级别26上不起作用

时间:2018-08-20 11:03:47

标签: android kotlin android-service android-8.0-oreo jobservice

在具有Android Oreo 8.0(API级别26)JobService.onTaskRemoved()的设备上未调用

  • 如何收听此类事件?

使用的代码停止工作:

class TaskRemovalWatcherService: JobIntentService() {
    ...
    override fun onTaskRemoved(rootIntent: Intent?) {  
    //not called on Android Oreo

        super.onTaskRemoved(rootIntent);   
        onAppRemovedFromRecentApps()
    }
}

从最近使用的应用中删除应用任务后,我需要

  1. 停止进程
  2. 完成第二个AppTask

如果AppTasks.size = 2并从最近的应用程序中删除了1个任务,则不会终止进程,因为第二个AppTask仍在内存中。

更新:

  1. 使用JobIntentService.enqueueWork时,紧接着JobIntentService.onHandleWork() JobIntentService.onDestroy()被称为
  2. 在无限制地安排作业时,使用JobService.schedule()时会抛出IllegalArgumentException

P.S。 每隔X秒检查一次isTaskWasRemoved的想法似乎不太好。

3 个答案:

答案 0 :(得分:0)

您可以覆盖JobService#onStop(),然后创建一条消息并将其传递给另一个服务,当该服务收到该消息时,您可以清理它的工作并杀死它。

答案 1 :(得分:0)

START_STICKY的预期行为可能由于设备制造商的自定义实现或android Oreo中的新实现而有所改变

您可以使用JobScheduler定期监视服务生命周期。 如果服务被销毁,则可以在实际上被销毁服务之前通过onDestroy()方法执行任务。

这将从onTaskremoved()方法中删除您的依赖项。

请参考以下类似问题 onTaskRemoved() not getting called when Home press & kill the app

答案 2 :(得分:0)

  

您的解决方法是依靠std::string ss="<tag2 name = \"Name1\">"; std::size_t pos1=ss.find_first_of("\""); std::size_t pos2=ss.find_last_of("\""); std::cout<<pos1<<std::endl<<pos2<<std::endl; 方法:

  1. 重新启动服务。

  2. 触发onDestroy()几秒钟后将触发的内容,然后再次启动服务。