Android 安卓会停止每项服务还是整个过程?

Android 安卓会停止每项服务还是整个过程?,android,service,process,Android,Service,Process,我们很多人都知道,Android中的服务如果不调用Service.startForeground(),就会被系统杀死。但这就是整个故事吗 我正在编写一些遗留代码,将“系统”权限应用程序移植到Play store。此应用程序有5个后台服务(不调用startForeground()),由于应用程序运行时的“系统”权限,这些服务到目前为止都是安全的。它安装在自定义设备上。由于时间和预算紧张,将这5个版本重构为1并不是一个短期的解决方案,但我们希望尽快转向公测版 简短的问题是: 如果没有前台活动或服

我们很多人都知道,Android中的
服务如果不调用
Service.startForeground()
,就会被系统杀死。但这就是整个故事吗


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

简短的问题是:

  • 如果没有前台
    活动
    服务
    ,Android是会杀死每个后台服务,还是仅仅杀死进程本身
以下是Android文档中的一些信息,讨论了Android在压力下如何终止进程:

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

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


常识说“安卓会毁掉这项服务”

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


考虑到上述情况,有几个解决问题的选项:

1) 做正确的事 将5个服务重构为1个,在不同的线程上运行。将1服务带到前台。问题解决了

不幸的是,目前还没有这方面的预算,由于项目的时间安排,我们更愿意找到一个快速解决方案

这是最终的解决方案,将在全面生产之前实施

2) 许多通知 在前台启动每个服务,每个服务都有自己的
通知
图标

这是一个混乱的解决方案,但将适用于测试现场试验,为我们赢得一些时间

我认为这是一种“蛮力”方法

3) 由一个服务保护的进程 如果杀死的是进程,而不是每个单独的服务,那么运行一个前台服务就足够了

这将“阻止”(即降低)Android终止进程

因此,所有5项服务都将继续存在

4) 一种服务可以统治所有人 这个例子告诉我们,如果一个服务绑定到另一个上下文,那么

stopService()或stopSelf()直到 所有客户都解除绑定

如果我从一个前台服务绑定到其他服务,这会使它们都保持活动状态吗


因此:
  • 安卓是否会杀死每个未绑定的后台服务?
  • 还是它只是杀死了运行应用程序的虚拟机?

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

因此,如果没有前台活动或服务运行,Android似乎会终止进程

如果没有前台活动或服务,Android会杀死它们吗 单个后台服务,还是它只是终止进程 本身

Android不会杀死个人
活动
服务
,这没有多大意义。例如,如果一个
活动
在后台,Android将永远不会决定专门杀死这个
活动
。不管内存中有什么类型的Java
Object
,所有这些
Object
实例都有相同的命运:如果不再需要/使用它们,它们将被垃圾收集。人们经常谈论一个
活动
在后台被杀死,这确实是一种误导,因为他们只是说它可以被垃圾收集,最终会被销毁。因此,这种垃圾收集会破坏对象的特定实例。这与内存不足的设备无关

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

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

常识说“安卓会毁掉这项服务”

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


现在,我们来看看您的解决方案:

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

这显然是
<service android:name=".MyService"
     android:isolatedProcess=true />