在带有Jelly Bean 4.1.1(官方)的Galaxy Nexus上,有时操作系统会进行大规模杀戮,并且日志中包含以下类型的条目:
10-02 22:24:34.992 I/ActivityManager( 306): Killing 7517:com.google.android.apps.reader/u0a77: remove task
10-02 22:24:36.484 I/ActivityManager( 306): Killing 7465:com.tf.thinkdroid.sg:writedroid/u0a50: remove task
10-02 22:24:37.273 I/ActivityManager( 306): Killing 5924:com.metago.astro/u0a73: remove task
10-02 22:24:37.296 W/ActivityManager( 306): Scheduling restart of crashed service com.metago.astro/.jobs.JobService in 5000ms
10-02 22:24:37.656 I/ActivityManager( 306): Killing 7302:org.jtb.alogcat/u0a84: remove task
10-02 22:24:38.148 I/ActivityManager( 306): Killing 7120:com.google.android.gm/u0a19: remove task
不幸的是,其中一个被杀死的进程是我的远程服务,它有一个运行的应用程序绑定它。实际上,服务会在之后立即重新启动,但这会导致我的应用程序出现不一致的行为。
服务既可以启动,也可以绑定连接。在 在这种情况下,系统只要保持服务运行 要么启动,要么有一个或多个连接 Context.BIND_AUTO_CREATE标志。
我的应用程序使用Context.BIND_AUTO_CREATE
绑定到远程服务,因此我的印象是只要主进程绑定到远程服务,远程服务就会保持不变。如何让Android不杀死远程服务?
注意:赏金用于解释为什么代码根据文档似乎不起作用。
答案 0 :(得分:4)
请在这里阅读Joel F的答案:How it is possible Service run indefinitely and also allow binding in android?
如上所述,如果确实需要资源,保持服务无法销毁的唯一方法是使用前台服务http://developer.android.com/guide/components/services.html#Foreground
文档也写得错误,因为引用:“系统将保持服务运行,只要它启动或有一个或多个连接到它”在100%的情况下是不正确的。 Context.BIND_AUTO_CREATE标志将为您的服务提供更高的权限,但不足以使其保持不可销毁。其他服务将首先被杀死,如果仍然需要资源,您的特权服务也将被杀死。
答案 1 :(得分:4)
服务是应用程序的一个组件,它在一个进程中运行。但是,根据服务生命周期文档,包含该服务的进程不应该被杀死,但是在Android可能会杀死时还有其他一些情况。
如果操作系统有一些资源短缺,它将优先运行正在运行的进程并以较低的优先级终止进程。现在,如果有多个进程正在运行,这些进程的服务承诺不会根据服务生命周期被终止,那么Android将优先处理并删除优先级较低的进程。
Android可能决定在内存时关闭某个进程 很低,并且需要更直接的其他流程 为用户服务。应用程序组件在进程中运行 因此被杀害了。再次启动进程 那些组件,当他们再次为他们工作时。
在决定杀死哪些进程时,Android系统会对其进行权衡 对用户的相对重要性。例如,它更容易关闭 下载不再可见的活动的进程 屏幕,与托管可见活动的进程相比。决定 因此,是否终止进程取决于状态 在该过程中运行的组件。
引自此处:http://developer.android.com/guide/components/processes-and-threads.html
当操作系统资源不足时,它被迫做出违反公平承诺的决定:)
答案 2 :(得分:1)
要设置服务不可杀戮,请查看android持久性服务:http://devescape.blogspot.ch/2011/02/persistent-services-in-android.html