TGViewer
开发者工具箱|编程·开发工具·资源 开发者工具箱|编程·开发工具·资源 @devtoolboxhub · 780 subscribers
Post #1618 10
Android 低功耗地理围栏引擎实践

开发者分享了一篇关于为 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
More from @devtoolboxhub
  1. Sep 26, 2026PostgreSQL 复制槽上限参数 max_replication_slots 解析 max_replication_slots 决定共享内存中复制槽数组的长度,仅此而已。它不决…
  2. Sep 26, 2026五仓库架构踩坑:Gitlink 与双 CI Flude 团队复盘了多仓库架构的实践代价。项目从第一分钟起就选择拆分成独立仓库,Pipeline、engine、design-docs…
  3. Sep 26, 2026Xeno Core:TypeScript 后端架构框架 Node.js 复杂系统的架构选型往往决定代码的长期命运。开发者常在两条路之间纠结:要么依赖重度使用实验性装饰器和反射(如…
  4. Sep 25, 2026用 SLO 给 AI Agent 的行为定个预算 Grafana Labs 提出把可靠性工程里的错误预算(error budget)思路用到 AI Agent 上。延迟、token…
  5. Sep 25, 2026Xcode 27.2 改用 JSON 项目格式 Xcode 27.2 用基于 JSON 的 project.xcproj 取代了沿用多年的 project.pbxproj。新建项目…
  6. Sep 25, 2026PostgreSQL 的 max_prepared_transactions 该不该开 prepared transaction 是脱离会话独立存在的两阶段提交事务。执行 PREP…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →