RUN_ANY_IN_BACKGROUND Android 9 新增的后台限制
两个后台权限的区别
Android 系统有两个相关但不同的后台运行 appop:
| appop | 引入版本 | 作用 | 控制效果 |
|---|---|---|---|
RUN_IN_BACKGROUND | Android 7 | 应用进程在后台能否继续执行代码 | 禁止后应用后台代码无法运行 |
RUN_ANY_IN_BACKGROUND | Android 9 | 应用能否在后台启动任何类型的服务 | 禁止后应用无法在后台启动任何 Service |
RUN_ANY_IN_BACKGROUND 是 Android 9 电源管理增强的一部分,比 RUN_IN_BACKGROUND 更严格——禁止的是"在后台启动服务"这个行为本身。
App Ops 的迭代历史
App Ops 对这两个权限的处理方式经历过变化:
- v2.6.0 之前:App Ops 把两者视为同一个,只显示一个"在后台运行"选项,修改时同时修改两个 appop
- v2.6.0 起:改为可以独立选择限制哪一个。原因是在某些情况下同时限制两个会导致限制过于严格,比如应用在某些场景下需要 RUN_ANY_IN_BACKGROUND 但不应该被完全禁止后台
在 App Ops 中查看
进入应用详情页的权限列表,在 Android 9+ 系统上你会看到:
- "在后台运行"(RUN_IN_BACKGROUND)
- "任意后台运行"(RUN_ANY_IN_BACKGROUND)
两者都可以用四种状态独立设置。
怎么设置更合理
没有通用的正确答案,取决于你的使用习惯和对该应用的信任程度。以下是一些建议:
方案一:两个都设为忽略(最激进)
效果最严格,应用基本失去后台能力。适合:
- 游戏、娱乐类应用
- 你完全不希望它后台运行的任何应用
方案二:只忽略 RUN_ANY_IN_BACKGROUND(推荐平衡)
RUN_ANY_IN_BACKGROUND 被禁止后,应用不能在后台主动启动新服务,但已有的后台服务还能继续运行。这比两个都忽略温和一些。适合:
- 想限制后台但不想完全禁止推送的应用
- 常用应用但希望减少后台耗电
方案三:只忽略 RUN_IN_BACKGROUND(温和)
限制后台代码执行但不阻止后台服务启动。某些应用需要后台服务(如音乐播放)但不需要后台代码。
方案四:两个都允许(默认)
不干预,让应用正常后台运行。适合:
- 你依赖后台服务的应用(如音乐播放器、下载器、VPN)
- 你信任且确实需要后台能力的应用
系统限制与厂商差异
- Android 9+ 的 App Standby Buckets 会根据应用使用频率自动把罕见应用归到"rare"桶,自动对这两个 appop 设更严格限制
- 厂商 ROM(MIUI、ColorOS、OneUI) 可能有额外的激进后台管理机制,App Ops 的设置可能与厂商策略叠加或被覆盖
- 某些厂商 ROM 甚至会在系统层面强制把某些 app 设为 RUN_ANY_IN_BACKGROUND = ignore,App Ops 改不了
注意事项
- 这两个 appop 与厂商的"自启动管理""后台冻结"不是一回事,是 Android 原生 appops 层的控制
- 设为忽略后应用可能无法正常后台推送、后台下载、后台播放音乐等
- 如果某应用设了忽略后后台功能不可用,改回允许即可恢复