6

在我的带有 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 不杀死远程服务?

注意:赏金是为了解释为什么代码似乎无法根据文档工作。

4

3 回答 3

4

请在此处阅读 Joel F 的答案:服务如何无限期运行并允许在 android 中绑定?

如前所述,如果确实需要资源,保持服务不被杀死的唯一方法是使用前台服务http://developer.android.com/guide/components/services.html#Foreground

文档也写错了,因为引用:“只要服务启动或有一个或多个连接,系统就会保持服务运行”在 100% 的情况下是不正确的。Context.BIND_AUTO_CREATE 标志将为您的服务提供更高的权限,但不足以使其无法被杀死。其他服务将首先被杀死,如果仍然需要资源,您的特权服务也将被杀死。

于 2012-10-08T11:43:01.410 回答
4

服务是应用程序的一个组件,它在进程中运行。虽然,根据服务生命周期文档,包含服务的进程不应该被杀死,但在其他一些情况下,Android 可能会被杀死。

如果操作系统资源不足,它会优先处理正在运行的进程,并杀死优先级较低的进程。现在,如果有多个进程在运行,并且根据服务生命周期承诺不被杀掉的服务,Android 会优先杀掉优先级较低的进程。

Android 可能会在某个时候决定关闭某个进程,当内存不足并且需要更直接地为用户服务的其他进程时。在被杀死的进程中运行的应用程序组件因此被破坏。当这些组件再次有工作要做时,将再次为这些组件启动一个流程。

在决定要杀死哪些进程时,Android 系统会权衡它们对用户的相对重要性。例如,与托管可见活动的流程相比,它更容易关闭托管在屏幕上不再可见的活动的流程。因此,是否终止进程的决定取决于在该进程中运行的组件的状态。

从这里引用:http: //developer.android.com/guide/components/processes-and-threads.html

When OS is running low in resouces, it is compelled to take decisions breaking fair promises :)

于 2012-10-08T11:51:27.337 回答
1

要设置服务不可终止,请查看 android 持久服务:http ://devescape.blogspot.ch/2011/02/persistent-services-in-android.html

于 2012-10-04T08:06:15.740 回答