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

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

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

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

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

问题是当我不使用该服务并从最近的应用程序中删除该应用程序时,它被正确杀死并且BLE连接正在结束,但是当我开始使用该服务时,应用程序进程似乎仍然处于活动状态并且BLE 连接保持不变。

我使用 Android Studio Profiler 进行了一些调查,我可以看到,从最近的应用中删除应用后,我的应用中没有 Activity 和 Service 正在运行,但 Application 对象仍然存在。

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

好像可能和this issue类似,但是没有答案。它也有点类似于 this issue,但我使用的是干净的 Android,而不是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},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

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

解决方法

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

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

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?