14

我正在开发一个作为服务运行并等待消息的应用程序。检查日志后,我发现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) 已经死亡。

4

2 回答 2

11

这很正常,操作系统会定期执行此操作。

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

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

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

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

但:

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

于 2013-02-07T09:52:52.077 回答
0

另一个可能的原因是为主线程定制了 Thread.UncaughtExceptionHandler。

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

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

你的进程将无声无息地死去。

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

于 2018-09-16T15:24:16.307 回答