在按照规定here测试后台执行限制时,我在我的服务中创建了一个线程。像这样:
expires
该服务由通常的前奥利奥// spawn own thread
HandlerThread thread = new HandlerThread("TestServiceThread");
thread.start();
启动。
在Android设备监视器中调试时我注意到的是我创建的线程继续长寿,健康并正常执行。这可以成为一种解决方法,以防止滥用系统资源而不通过前台服务或工作做事吗?或者它只是对即将结束的框架的追逐?有什么意见吗?
答案 0 :(得分:2)
我不希望改变。它不可能(不仅仅是在Android中,理论上不可能)在没有线程帮助的情况下安全地杀死一个线程。否则,您可以在其他线程将死锁,数据不一致或应用程序可能无法运行的情况下终止该线程。这就是为什么不推荐使用thread.stop()的原因 - 因为没有办法让它安全。这就是你中断线程的原因,线程需要监视isInterrupted并干净地退出。
答案 1 :(得分:1)
我会小心这种方法。
尽管Gabe Sechan的答案非常有效,但依靠这项工作的危险性太高,无法追究这一点。谷歌明显没有得到任何试图执行后台执行并滥用用户电池的应用程序,我认为这是有充分理由的。有些应用根本不尊重用户的电池。
文件明确指出:
如果以下任何一项,应用程序将被视为处于前台 是的:
无论活动是开始还是暂停,它都有可见的活动。 它有一个前台服务。另一个前台应用程序连接到 应用程序,通过绑定到其中一个服务或通过使用 其中一个内容提供商。例如,应用程序在 前景,如果另一个应用程序绑定到它:IME壁纸服务 通知监听器语音或文本服务如果没有 条件为真,应用程序被认为是在后台。
来源: https://developer.android.com/about/versions/oreo/background.html#services
虽然由于Gabe提到的所有原因而杀死一个帖子是不安全的,Android可能会完全杀死该应用程序(ala kill -9)。我认为任何死锁都将由Android处理(这不是一件很重要的事情,我确定)。如果没有正确处理后台执行,数据损坏将被视为应用程序的错误。
这对Android来说有点风险,但他们可能已经权衡了它,并认为这是可行的方法。
另外,请注意:
注意:默认情况下,这些限制仅适用于定位的应用 Android 8.0(API级别26)或更高版本。但是,用户可以启用最多 对于来自“设置”屏幕的任何应用程序的这些限制,即使 该应用程序的目标是API级别低于26。
来源:https://developer.android.com/about/versions/oreo/background.html#overview