如何在应用处于后台或被杀死时接收计步器事件?
实现全场景计步器事件监听的可行方案
1. 前台服务+传感器监听(实时监听核心方案)
从Android 8.0开始,后台应用的传感器监听会被系统严格限制,普通后台监听根本无法持续生效。要实现实时监听,必须把传感器监听逻辑放在前台服务里:
- 编写一个前台服务,在服务内部通过
SensorManager注册计步器(推荐用StepCounter,可累计设备重启后的总步数)的监听器。 - 服务启动时必须弹出一个前台通知(可以做低存在感的样式,比如仅显示“计步中”),这样系统才会将服务判定为前台优先级,不会轻易回收。
- 权限要配全:API 31+需要
FOREGROUND_SERVICE_SENSORS,API 29+需要ACTIVITY_RECOGNITION,且必须动态申请这些权限,否则监听器无法正常注册。
2. 历史步数补全(应对应用被杀场景)
就算前台服务做得再完善,也有可能被用户手动杀掉或厂商系统强制清理。这时候可以用StepCounter的历史数据来补全:
- 每次监听到步数变化时,将当前总步数存储到本地(比如SharedPreferences或Room数据库)。
- 应用重启后,直接读取
StepCounter的当前总步数,和本地存储的数值对比,差值就是应用被杀期间新增的步数,据此触发通知。 - 这个方案不需要持续保持监听,能覆盖应用被杀后的步数统计需求。
3. WorkManager定期同步(补充方案)
你之前用PeriodicWorker没效果,是因为系统对后台任务的调度限制(比如Doze模式、App Standby),优化配置后可作为兜底:
- 创建
PeriodicWorkRequest时,设置合理约束(比如setConstraints(new Constraints.Builder().setRequiresBatteryNotLow(true).build())),重复间隔设为系统允许的最小值15分钟。 - 在Worker内部获取当前总步数,和本地历史值对比,有变化就发送通知。
- 这个方案做不到实时,但能定期同步步数,作为实时监听的补充。
避坑提醒
- 小米、华为、OPPO等厂商的定制系统后台管控极严,一定要引导用户把应用加入后台白名单和自启动权限,否则前台服务也可能被强制终止。
- 持续监听传感器会消耗电量,建议做个手动开关,或根据时间自动暂停(比如夜间0点到6点停止监听),平衡功能和功耗。
内容的提问来源于stack exchange,提问作者Zelig
相关产品推荐
相关产品推荐

