从foreground Service启动的服务 是否可避免低资源时被系统杀死
问题结论
从前台服务启动的普通服务不会自动获得和前台服务同等的优先级,服务的优先级和启动来源没有直接关联,仅由服务自身所属进程的优先级决定。
核心逻辑说明
Android系统低内存时的进程回收规则是基于进程的oom_adj值判定,值越低优先级越高、越不容易被回收,优先级绑定的是整个进程而非单个组件的启动关系,分两种常见场景说明:
- 如果你启动的
mServiceA和前台服务mForegroundService运行在同一进程:因为前台服务已经把整个进程的优先级拉到前台进程级别,同进程内的所有组件都会共享这个高优先级,只要前台服务正常运行,mServiceA不会被系统单独回收(Android不会销毁进程内的单个组件,只会直接回收整个进程) - 如果你给
mServiceA单独配置了独立进程(Manifest中配置了android:process属性):该独立进程没有前台服务加持,优先级就是普通后台服务级别,不管启动方是谁,低内存时都会被系统优先回收,和前台服务所在进程的优先级完全无关
实践建议
如果需要mServiceA获得和前台服务一致的抗回收能力,可选择以下两种方案:
- 不要给
mServiceA配置独立进程,让它和前台服务运行在同一进程,共享高优先级 - 给
mServiceA自身也调用startForeground()升级为前台服务,注意Android 12及以上版本需要申请前台服务相关权限、配置合规的服务类型和持续通知
如果只能用普通后台服务,可以在onStartCommand中返回START_STICKY,让系统资源充足时自动重启服务,但该方式无法避免被回收,仅能提升恢复概率。
内容的提问来源于stack exchange,提问作者basit9
相关产品推荐
相关产品推荐

