Android会杀死每个服务还是整个进程?

Ric*_*ier 17 service android process

我们中的许多人都知道(在松散的情况下)Service如果没有调用,Android中的一个将被系统杀死Service.startForeground().但这是整个故事......?


我正在研究一些遗留代码,将"系统"权限应用程序移植到Play商店.startForeground()由于应用程序运行的"系统"权限,此应用程序有5个后台服务(不调用),这些服务到目前为止是安全的.它安装在自定义设备上.由于时间紧迫和预算紧张,将这5个重构为1不是短期解决方案,但我们希望尽快转向公测.

简短的问题是:

  • 如果没有前景,Activity或者ServiceAndroid是否会杀死每个单独的后台服务,还是只是杀死进程本身?

以下是有关进程和线程的Android文档中的一些信息,讨论了Android在压力下如何终止进程:

Android可能会决定在某个时刻关闭某个进程,此时内存不足并且需要更快立即为用户提供服务的其他进程.因此,在被杀死的进程中运行的应用程序组件将被销毁.当这些组件再次为它们工作时,将再次启动该过程.

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


常识称" Android会杀死服务 "

个人经验表明,Android也会杀死进程本身(如上面引用中所述).这可以通过在Application对象中存储对象来显示,并注意到在服务被终止后它们会被重新初始化.


考虑到上述因素,有一些解决问题的方法:

1)做正确的事

将5个服务重构为1,在各种不同的线程上运行.将1服务带到前台.问题解决了.

不幸的是,目前还没有这方面的预算,我们宁愿根据项目时间表找到快速解决方案.

这是将要实施的最终解决方案.

2)许多通知

在前台启动每个服务,每个服务都有自己的Notification图标.

这是一个混乱的解决方案,但将适用于beta现场试验,购买我们一段时间.

我认为这是"蛮力"的做法.

3)受一项服务保护的流程

如果它是被杀死的进程,而不是每个单独的服务,那么运行单个前台服务就足够了.

这将"防止"(即降低Android)杀死进程的可能性.

所有5项服务都将继续存在.

4)一项服务来统治它们

服务上文档告诉我们,如果服务绑定到另一个上下文,那么

stopService()或stopSelf()实际上不会停止服务,直到所有客户端解除绑定.

如果我从单个前台服务绑定到其他服务,那么它们会保持活着吗?


所以:

  • Android会杀死每个未绑定的后台服务吗?
  • 或者只是杀死运行应用程序的VM?

更新

经过18个 41小时的测试#3(受一个服务保护的进程),所有6个服务仍在运行(5个旧加1个新服务).

因此,如果没有前台活动或服务正在运行,那么看起来Android会杀死进程.

Xav*_*ler 6

如果没有前台活动或服务,Android会杀死每个单独的后台服务,还是仅仅杀死进程本身?

Android不会杀死个人,Activities或者Services说没有多大意义.例如,如果一个人Activity在后台,Android永远不会决定专门杀死这个Activity.Object内存中的Java类型并不重要,所有这些Object实例共享相同的命运:如果不再需要/使用它们,它们将被垃圾收集.人们经常谈论Activity在背景中被杀的人,这真的是误导,因为他们只是意味着它可以被垃圾收集,最终会被收集.因此,这种垃圾收集会破坏对象的特定实例.它与具有低内存的设备无关.

当Android内存不足时,它将决定终止整个进程,正如您已在文档中读到的那样,它会选择最不重要的进程.

我想告诉你的是,这些是两个根本不同的过程.一个是Android操作系统在内存耗尽时杀死不重要的进程,另一个是垃圾收集器,它不断寻找可以释放的不再使用的内存.

常识称"Android会杀死服务"

正如我上面解释的那样,这可能会产生误导并且不完全正确,如果设备内存不足,它将终止整个过程,而不仅仅是特定的过程Service.这与Service不再使用时收集的垃圾不同.


现在问你的解决方案:

将5个服务重构为1,在各种不同的线程上运行.将1服务带到前台.问题解决了.

这显然是最好的选择,但正如你所说,你现在无法实现这一点.

在前台启动每个服务,每个服务都有自己的通知图标.

这将是一种糟糕的解决方案,没有理由有多个通知.其他选择显然更好.

如果它是被杀死的进程,而不是每个单独的服务,那么运行单个前台服务就足够了.

这肯定有用,我会试试.

服务上的文档告诉我们,如果服务绑定到另一个上下文,那么

stopService()或stopSelf()实际上不会停止服务,直到所有客户端解除绑定.

如果我从单个前台服务绑定到其他服务,那么它们会保持活着吗?

在我看来,这是下一个最好的选择.


我最初想过Service在自己的过程中开始每一个.但我不确定这是否适用于您.特别是如果你想在任何时候保持所有 Services运行.Service在其自己的过程中启动a的好处显然是它独立于应用程序的其余部分.因此,即使某些部分由于内存限制而被杀死,应用程序的其余部分也将继续在其他进程中运行.

你有没有想过使用继承来解决问题?这可能是实现选项的最简单方法1).