2017-10-11 153 views
1

在测试后台执行限制here时,我在我的服务中创建了一个线程。这样的事情:创建的后台线程不会被Android杀死O

// spawn own thread 
HandlerThread thread = new HandlerThread("TestServiceThread"); 
thread.start(); 

该服务是由通常的奥利奥前startService开始。 我在Android设备监视器中进行调试时注意到的是,我创建的线程继续保持长久健康并正常执行。这可以成为一个解决方法,以防止滥用系统资源,而不是通过前台服务或工作做事吗?或者它只是对即将结束的框架的追逐?任何意见 ?

回答

1

我不希望改变。它不可能(不仅仅是在Android中,它在理论上是不可能的)在没有线程帮助的情况下安全地杀死一个线程。否则,您可以在其他线程死锁,数据不一致或应用程序可能无法正常工作的情况下终止线程。这就是为什么thread.stop()被弃用的原因 - 因为没有办法使它安全。这就是为什么你中断一个线程,而线程需要监视isInterrupted并干净地退出。

1

我会小心这种方法。

虽然Gabe Sechan的回答非常有效,但依靠这项工作的危险性太高,无法追求这一点。谷歌显然希望得到任何试图执行后台执行和滥用用户电池的应用程序,并且我认为这是有充分理由的。有些应用根本不尊重用户的电池。

的文件中明确指出:

的应用被认为是在前台如有以下 的是真实的:

它有一个明显的活动,该活动是否开始或暂停。 它有一个前台服务。另一个前台应用连接到该应用的 ,可以通过绑定到其某个服务或通过使用其内容提供商之一 。例如,如果其他应用绑定到其IME墙纸服务 通知侦听器语音或文本服务,则前景应用位于 前景如果这两个 条件都不成立,则认为该应用位于后台。

来源: https://developer.android.com/about/versions/oreo/background.html#services

尽管这不是安全的杀死一个线程由于加布提到的所有原因,机器人很可能终止该应用完全关闭(ALA杀-9)。我会想象任何死锁都会由Android处理(我确定这不是一件简单的任务)。数据损坏将被视为该应用程序的错误,因为没有正确处理后台执行。

这对Android来说有点风险,但他们可能已经对它进行了权衡,并决定这是一条路。

而且,照顾这样的:

注意:默认情况下,这些限制只适用于针对Android的 8.0(API级别26)或更高版本的应用程序。但是,即使该应用的目标API级别低于26,用户也可以在“设置”屏幕中为任何应用启用这些限制的大部分 。

来源:https://developer.android.com/about/versions/oreo/background.html#overview

+0

我同意,所以我搬到后台执行到需求的Android作业。 –