使用服务时从最近的任务中删除应用程序不会被杀死
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"
添加到您的服务定义中
首先,这个问题不是关于如何防止应用程序被杀死的问题。其实我想杀了它
现在是问题。我的应用程序连接到 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"
添加到您的服务定义中