指导原则
一般来说,运行时间超过几毫秒的所有任务都应委派给子线程。长时间运行的常见任务包括解码位图、访问存储空间、处理机器学习 (ML) 模型、执行网络请求等。
后台优化
后台进程可能会耗费大量内存和电池电量。例如,某一隐式广播可能会启动许多已注册监听它的后台进程,即使这些进程可能并没有执行很多任务。这会对设备性能和用户体验产生重大影响。
为缓解此问题,Android 7.0(API 级别 24)施加了以下限制:
- 如果以 Android 7.0(API 级别 24)及更高版本为目标平台的应用在清单中声明其广播接收器,则这些应用不会收到 CONNECTIVITY_ACTION 广播。如果应用使用 Context.registerReceiver() 注册 BroadcastReceiver 且该 Context 仍有效,则它们仍会收到 CONNECTIVITY_ACTION 广播。
- 应用无法发送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 广播。此项优化会影响所有应用,而不仅仅是那些以 Android 7.0(API 级别 24)为目标平台的应用。
用户发起的限制
无限制:允许所有后台工作,这可能会消耗更多电量。
优化(默认):根据用户与应用互动的方式,优化应用执行后台工作的能力。
受限:完全禁止应用在后台运行。应用可能无法正常运行。
注意:如果用户在将您的应用置于“受限”状态之后启动了该应用,系统会暂时将该应用视为处于“无限制”状态。当用户停止与您的应用互动并开始与另一个应用互动时,系统会将您的应用重新置于“受限”状态。
施加的确切限制由设备制造商决定。例如,在搭载 Android 9(API 级别 28)或更高版本的 AOSP build 中,在后台运行且处于“受限”状态的应用存在以下限制:
- 无法启动前台服务
- 现有的前台服务会从前台移除
- 不会触发闹钟
- 不会执行作业
此外,如果应用以 Android 13(API 级别 33)或更高版本为目标平台且处于“受限”状态,除非应用因其他原因启动,否则系统不会传送 BOOT_COMPLETED 广播或 LOCKED_BOOT_COMPLETED 广播。