开发者分享了一篇关于为 Android 后台服务构建低功耗地理围栏引擎的技术文章,核心思路是用系统级 GeofencingClient 替代高频 GPS 轮询,实现按物理位置自动切换手机声音模式。
作者最初想解决的是公共场合手机响铃的尴尬场景:在办公室自动振动、在家恢复响铃、在诊所自动静音。传统方案依赖 GPS 轮询,几小时就能耗尽电量。改用 GeofencingClient 后,系统会综合 Wi-Fi、基站和 GPS 数据,只在跨越围栏边界时才唤醒应用,能耗大幅降低。
实现上通过 PendingIntent 将触发逻辑与应用进程解耦,即使应用被系统回收,围栏注册仍由 Google Play Services 进程持有。BroadcastReceiver 收到事件后唤醒 ForegroundService,再切换 AudioManager 状态。代码中特意使用 FLAG_IMMUTABLE 防止其他应用劫持 Intent 篡改静音模式。
作者踩过的坑包括:部分厂商的激进省电策略会抑制 Doze 模式下的围栏触发,直到用户手动亮屏才生效;排查了三周才发现是 WorkManager 交互导致退出事件不触发,最终强制应用忽略电池优化。另外 Play Services 定位库是个黑盒,系统因低电量降级围栏时无从得知原因。
给同行的建议是别自己写轮询循环,在电源管理上不可能赢过 Google 的工程师。用高层的 GeofencingClient 并把精力花在边界情况上:GPS 信号丢失怎么办、用户在地下室怎么办。始终假设应用会在最不合时宜的时刻被杀掉,用 PendingIntent 加本地数据库(作者用 Room)保证重启后能立即恢复配置。
作者将这套方案落地为应用 Muffle,用户无需手动切换声音配置。核心教训是:做后台定位服务要顺着系统限制走,而不是对抗它。
#开发者 #工具 #Android #Kotlin #Geofencing #后台服务 #低功耗 #GPS #Muffle
@DevToolboxHub
