如何开发App被移出最近任务列表后仍可正常运行的定时器?
后台5分钟计时发奖励适配方案
针对Android 8.0(Oreo)及以上系统的后台进程限制,可按优先级选择以下可落地方案:
方案1:端侧调度+云端兜底(推荐,无漏发风险)
- 游戏结束时,同时做两个操作:
- 本地持久化存储(使用
SharedPreferences/MMKV均可)记录「奖励ID、奖励内容、到期时间戳」 - 将相同的待发放奖励记录同步上传至你的业务服务端
- 本地持久化存储(使用
- 端侧使用Jetpack官方组件
WorkManager调度任务:- 构建
OneTimeWorkRequest实例,设置5分钟延迟执行,传入奖励相关参数 - 将任务入队
WorkManager,组件会自动适配系统后台限制,只要应用没有被用户强行停止,任务到期就会触发 - 自定义Worker类中编写奖励发放逻辑:先校验本地存储的到期时间戳是否符合要求,校验通过后更新本地奖励状态,同时同步给服务端标记已发放
- 构建
- 服务端兜底逻辑:用户每次启动App时,请求服务端拉取待发放奖励列表,服务端判断如果奖励已到约定时间未发放,直接返回给端侧触发发放,覆盖端侧调度失效的场景
方案2:纯端侧AlarmManager实现(无服务端场景可选)
- 游戏结束时计算5分钟后的时间戳,使用
AlarmManager.setExactAndAllowWhileIdle()方法设置定时触发的PendingIntent,该类型闹钟可以穿透系统低电耗模式触发 - 自定义
BroadcastReceiver接收闹钟触发的广播,收到广播后直接执行本地奖励发放逻辑 - 注意事项:国产定制ROM普遍存在电池优化策略,会拦截未加入电池白名单的应用的闹钟事件,需要额外引导用户给应用开启「后台活动权限/无限制电池权限」,否则会有一定概率触发失败
不推荐的旧方案
- 前台Service方案:Android 8.0以后启动前台Service必须展示常驻通知,会对用户造成明显打扰,且部分ROM划掉应用时仍会销毁前台Service进程,稳定性不如上述方案
- 普通
CountDownTimer/Handler方案:仅在应用进程存活时有效,进程销毁后立刻停止,完全无法满足需求
内容的提问来源于stack exchange,提问作者Avni Krtigya
相关产品推荐
相关产品推荐

