如何防止服务因未被捕获的异常而被Android杀死?

时间:2012-04-14 16:36:41

标签: android android-service android-anr-dialog uncaughtexceptionhandler

我正在调查是否有任何方法可以防止因未捕获的异常导致Android服务被杀死 我们有10个UI应用程序与5-6服务通信。该平台是Android 2.2。
由于无法预料的情况,服务中的一些逻辑偶尔抛出异常。这导致这些服务被那些烦人的ANR弹出窗口杀死。 虽然我们致力于解决这些异常的根本原因的解决方案,但我希望防止Android杀死违规服务。

看起来我可以为服务中的所有线程注册Uncaught默认异常处理程序。这只是让我有机会记录关于异常的事情。那很好。 我遇到过许多使用此技术将崩溃信息记录到文件中供以后使用的帖子。 人们建议不要抛出原来的例外以防止ANR弹出。我还发现一些文章表明它可以让你的服务处于半死状态。正确的做法是终止服务并重新启动。杀戮和重新启动不是我感兴趣的选项。

如果不抛出异常,我不太了解半死状态部分。我将进一步调查。同时我想知道人们是否有建议 我的目标是防止ANR弹出窗口。 我希望我的代码能够决定是否重新启动服务,而不是Android框架为我决定。

我很想知道的是:
1)清单中是否有任何标志可以更改,以防止服务被框架代码杀死?

2)是否有任何方法可以在服务中覆盖,允许您处理未捕获的异常,但是仍然让服务线程返回到等待状态以便客户端发出下一个请求?

感谢您的建议。

Videoguy

更新的:
Uncaught默认异常处理程序在这里没有帮助。它为您提供了记录内容的机会,但服务线程仍然存在。

您需要更改android框架,以便它不会杀死进程。 android框架中的ActivityManagerService.java具有不同的阈值,服务可以在没有任何客户端的情况下运行多长时间,您可以拥有多少后台活动/服务,服务超时和ui初始化。我们提高了这些价值。

2 个答案:

答案 0 :(得分:1)

开发人员帮助防止服务被杀的一种常见方式是使用持久性通知(在通知栏中),通常通过设置进行切换。因此,如果用户遇到系统终止服务的问题,他们可以切换通知。

答案 1 :(得分:1)

  

清单中是否有任何标志可以更改,以防止服务被框架代码杀死?

没有

  

您是否可以在服务中覆盖任何方法来处理未捕获的异常,但是仍然让服务线程返回到等待来自客户端的下一个请求的状态?

没有