Android进程经常产生logcat“已死亡”消息。

Posted

技术标签:

【中文标题】Android进程经常产生logcat“已死亡”消息。【英文标题】:Android process produces logcat "has died" message very often. 【发布时间】:2013-02-07 09:33:17 【问题描述】:

我正在开发一个作为服务运行并等待消息的应用程序。检查日志后,我发现android经常杀死并重新启动许多进程!这不仅发生在我的应用程序中,对于许多其他服务也是如此。

我看不出有什么原因,而且我的设备有足够的内存。我使用运行 Android 4.0.4 的 Sony Xperia S 进行测试。这是正常现象还是错误?

这是日志的一部分,向您展示我的意思:

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) 已死亡。

【问题讨论】:

您是否真的遇到了问题,或者只是想知道为什么它如此频繁地出现在日志中? 【参考方案1】:

这很正常,操作系统经常这样。

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

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

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

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

但是:

请使用AlarmManagerIntentService,这样您的服务不需要在内存中,除非它正在做有意义的工作。这也意味着 Android 不太可能在您在内存中时终止您的服务,用户也不太可能因为认为您在浪费内存而终止您的服务。

【讨论】:

您好,感谢您的快速答复!我知道这个选项,但我不开发系统应用程序!关键,为什么我想知道日志是,我可以在我自己的日志文件中看到,我的应用程序在昨天上午 9:00 和晚上 9 点之间被杀死了 3 次,但是在这个晚上,我的手机放在桌子上充电它被杀死了 15 次,而且大多延迟了几分钟。为什么经常在无事可做的地方? 这是操作系统决定什么时候做以及为什么做的事情。再次,仍然正常。我不知道这件事的细节。如果您不制作系统应用程序,则无法制作持久服务。你应该使用AlarmManager 和IntentService。这样Android就不会杀死你的服务。因为它实际上是在内存中使用的。 蒂姆。如果它是一个聊天应用程序,您需要保持服务运行。我的服务经常被杀死,而且时间很长 - 3m-9m 秒【参考方案2】:

还有一个可能的原因是主线程自定义了 Thread.UncaughtExceptionHandler。

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

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

你的进程会默默地死掉。

如果您只想存储异常并且不显示某些后台进程可能出现的错误对话框,这是一种方便的方法。

【讨论】:

以上是关于Android进程经常产生logcat“已死亡”消息。的主要内容,如果未能解决你的问题,请参考以下文章

Android AsyncTask 进程(logcat)不输出消息(在模拟器上)

android logcat怎么获取某个进程的日志

如何读懂和分析Android的logcat以及stack traces

android 系统 应用程序运行产生的 logcat文件存储位置在哪里?

我的Android进阶之旅 adb logcat 输出同一个进程的所有输出

怎么用eclipse还有logcat命令的过滤log信息