安卓进程经常产生"logcat已死"的信息。

15
我正在开发一个作为服务运行并等待消息的应用程序。在检查日志后,我发现Android经常杀死和重启许多进程!这不仅会发生在我的应用上,而且对许多其他服务也是如此。我无法找到任何原因,并且我的设备有足够的内存。我使用运行Android 4.0.4的Sony Xperia S进行测试。这是正常还是一个bug?以下是日志的一部分以帮助您理解:

02-04 15:02:38.791 320 332 I ActivityManager: 进程com.android.email(pid 32763)已终止。 02-04 15:02:38.791 320 332 W ActivityManager: 安排在5000毫秒后重新启动崩溃的服务com.android.email/.service.MailService

.... 13分钟后 :

02-04 15:15:32.601 320 694 I ActivityManager: 进程com.android.email(pid 1453)已终止。


你是真的遇到了问题还是只是好奇为什么它经常出现在日志中? - Jan Hudec
2个回答

12

这是正常的,操作系统定期执行此操作。

为什么? 每个应用程序或服务在不活动或处于后台时会保留在内存中,直到Android内存管理器决定它要么无意义地占用太多内存,要么另一个活动的应用程序/服务需要它。例如,当您在电子邮件应用程序中单击home按钮时。重新打开应用程序时,它将返回到您所在的确切位置。因为此应用程序只是暂停并处于某种休眠模式中。除非Android需要为其他任何事情分配该内存,否则它会保留在那里。

确保操作系统不会关闭您的服务的一种方法是创建持久性服务。

只有开发系统应用程序才能使服务持久。这些服务基本上是不可杀死的,并标记为“PERS”在“adb shell dumpsys activity”命令的输出中。

http://www.androidguys.com/2009/09/09/diamonds-are-forever-services-are-not/

但:

请使用AlarmManagerIntentService,这样您的服务在不执行有意义的工作时无需保留在内存中。这也意味着Android在您仍在内存中时很可能不会杀死您的服务,而用户也不太可能杀死您的服务,因为他们认为您正在浪费内存。


嗨,感谢您的快速回复!我知道这个选项,但我不开发系统应用程序!我想知道日志的原因是,我可以在自己的日志文件中看到,昨天我的应用程序只被杀死了3次,时间在上午9点到晚上9点之间,但在这个夜晚,当我的手机放在桌子上充电时,它被杀死了15次,而且大多数都有几分钟的延迟。为什么在夜晚会这么频繁地发生,明明没有任何操作呢? - Aki
这是操作系统决定何时以及为何执行的事情。再次强调,这是正常的。我不知道具体细节。如果你没有开发系统应用,就不能创建一个持久性服务。你应该使用AlarmManager和IntentService。这样安卓系统就不会杀掉你的服务,因为它实际上正在内存中被使用。 - Timmetje
Tim,如果这是一个聊天应用程序,你需要保持服务运行。我的服务经常被杀死,并且时间非常长 - 3m-9m秒。 - Harshit Bangar

0

可能的另一个原因是由于对主线程的Thread.UncaughtExceptionHandler进行了自定义。

默认情况下,如果进程由于某些未捕获的异常而被杀死,则Android操作系统将显示错误对话框。但是,您可以设置自定义的Thread.UncaughtExceptionHandler,并且不将Exception传播到默认的Thread.UncaughtExceptionHandler,而是只能结束进程。然后,您将在日志中看不到任何错误消息,除了

02-04 15:02:38.791 320 332 I ActivityManager:进程com.your.app(pid 32763)已经死亡。

您的进程将悄无声息地终止。

如果您只想存储Exception而不显示可能为某些后台进程的错误对话框,那么这是一种方便的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接