为什么服务仍在运行,如果它的进程被杀死?

Ang*_*elo 5 android process android-service

我通过反编译检查了在某些应用程序的清单中,服务不是通过单独的进程启动的.顺便说一句,在任务管理器中,它显示为"正在运行".

例如,在Android 4.4.2上,Facebook有0个进程和2个服务正在运行.从文档中(如果我错了,请纠正我)我已经明白服务在其应用程序的相同过程中运行.如果进程终止,则服务停止(并且可以由AlarmManager或START_STICKY自动重新启动).

因此,如果它没有在一个单独的进程内启动,那么至少应该有一个服务可以运行的进程.那么,即使没有进程,服务是否可能运行?我再说一遍,服务(来自清单)没有GOT指令android:background

编辑1: 这似乎是Android 4.4.2的一个错误.看到这个和这个.在我的情况下,当我从列表中滑动应用程序时遇到问题(如第二个链接中所述)

编辑2: 如果我错了,请纠正我,这是我所理解的.

一个Service对象首次创建时startService()被调用.onCreate()将在该Service对象上调用onStartCommand()并将跟随.从现在开始:

  • 如果进程终止,则服务对象仍然存在(如果stopSelf() 未调用)但它没有运行.
  • 如果服务中断,则重新创建的唯一方法是从START_STICKY(和其他重启常量)或手动调用startService().当服务从系统中终止时,将再次调用onCreate.

现在,这是Android <4.4.2上的正常行为.在KitKat上,如果从LRU列表中滑动应用程序,则进程会死亡,即使使用START_STICKY,它也不会自动重新启动.解决方法是AlarmManager.这是对的吗?

G. *_*ike 1

您的服务是您的应用程序的一部分。根据定义,当服务运行时,您的应用程序也在运行。例如,当 AlarmManager 在预定时间调用您的服务时,Android 首先为应用程序启动一个进程(如果它尚未运行),然后在当前运行的应用程序中调用您的服务。

一般来说,你是对的:如果应用程序(进程)死亡,服务也会随之死亡。

Android 支持 Manifest 属性,android:process它允许您指定应用程序的特定组件应在单独的进程中运行。本质上,这会在多个进程中运行应用程序的多个相同副本。Android 只是使用其中一个进程来运行一个组件,并使用另一个进程来运行另一个组件。您的应用程序在两者中运行。

混乱的根源在于“设置”>“应用程序”页面使用“进程”和“服务”一词的方式。它似乎使用前者来计算具有 UI 组件的进程,而后者来计算所有其他进程。如果您使用 adb 连接到您的设备并使用“ps”命令,您将得到更好地反映这些单词的共同理解的内容。