使用服务时从最近的任务中删除应用程序不会被杀死

App isn't killed when removed from recent tasks when using service

首先,这个问题不是关于如何防止应用程序被杀死的问题。其实我想杀了它

现在是问题。我的应用程序连接到 BLE 设备,我希望当应用程序在后台时保持连接,但我不希望当用户从最近的应用程序中删除该应用程序时保持连接。

我实现了一项服务,当连接启动时,我 运行 会在应用程序进入后台时将其发送到前台。我只尝试了 bound service,当 activity 被销毁时,bound service 也被销毁,我还尝试了 started service,我在 onTaskRemoved 中停止了。两种情况都有相同的问题。

问题是当我没有使用该服务并从最近删除该应用程序时,它被正确杀死并且BLE连接被终止,但是当我开始使用该服务时,应用程序进程似乎还在活动且 BLE 连接持续存在。

我使用 Android Studio profiler 做了一些调查,我可以看到在我从最近的应用程序中删除该应用程序后,没有 Activity 也没有服务 运行ning在我的应用程序中,但 Application 对象仍然存在。

Leakanary 也不报告任何内存泄漏。

好像和this issue, but there was no answer. It is also a bit similar to this issue差不多,不过我用的是cleanAndroid,不是cordova

我调查了 Logcat 并且在没有服务的流程中我得到:

HwRecentsTaskUtils: remove task send broadcast packageName={my_package_name}, userId=0,taskId=16893
ActivityManager: Killing 30468:{my_package_name}/u0a918 (adj 900): remove task
…
WindowManager: WIN DEATH: Window{bcb8d8c u0 {my_package_name}/{my_package_name}.MainActivity}

在有服务的情况下,我得到:

HwRecentsTaskUtils: remove task send broadcast packageName={my_package_name}, userId=0,taskId=16894
…
ActivityThread: Remove activity client record, r= ActivityRecord{787d7fd token=android.os.BinderProxy@216a996 {{my_package_name}/{my_package_name}.MainActivity}} token= android.os.BinderProxy@216a996
MyService: service onTaskRemoved
MyService: service onDestroy

在第二种情况下,应用程序任务似乎没有被删除,我不知道为什么。当 activity 和服务均未激活时,是什么阻止了我的应用程序被终止?

您正在谈论托管您的应用程序的 OS 进程,而不是“任务”(这是一个 Android 构造)。 Android 负责杀死 OS 进程并回收它们。它在它想做的时候做,如果它想做的话,你无法控制它。您不能假设您的 OS 进程在任何特定情况下都会被终止。

您需要以能够处理发生的任何事情的方式编写代码。

您可以试试这个,在 AndroidManifest.xml 中,将 android:stopWithTask="true" 添加到您的服务定义中