背景中的地理围栏
Posted
技术标签:
【中文标题】背景中的地理围栏【英文标题】:Geofencing in background 【发布时间】:2020-02-24 18:49:10 【问题描述】:开始问题:如何在不打开应用程序的情况下添加/删除地理围栏?
当用户关闭位置时,所有地理围栏都会被删除。引入地理围栏时,我正在对其进行测试,并且能够通过处理"android.location.PROVIDERS_CHANGED"
广播在后台添加/删除地理围栏,但分支上仍然有此代码。
目前,由于 API26,此广播在放入清单时不会触发,我们需要为此操作注册(和取消),例如在Activity
或Service
的运行时。这不是我的情况的解决方案,我想在打开位置时再次添加地理围栏,或者只是阻止删除已经添加的。
我确实看到了针对这种情况的两种解决方案,但都有一些缺陷......
-
前台服务 - 在位置开启/关闭时添加/删除地理围栏的粘性服务,
Service
可以接收PROVIDERS_CHANGED
。但我不喜欢粘着Notification
总是为了这个微不足道的目的...
工作/工作 - 检查位置状态并根据结果添加/删除地理围栏,最后重新安排自己的实例,例如1h,再一次。短期服务(最多 5 秒)不需要有“视觉表示” - Activity
在前景或粘性 Notification
- 但几秒钟就足以检查位置状态和使用地理围栏(只是逻辑,非常漂亮快)
我没有测试第二种方法,但这似乎是一种解决方法,肯定效率很低。我想公平地说,在请求许可时,我会告知用户在后台“监听”位置的目的(API29 上也是 ACCESS_BACKGROUND_LOCATION
)。那么当应用程序处于后台/被杀死时,我能做些什么来保持这些栅栏活着呢?
【问题讨论】:
【参考方案1】:ForegroundService 是您拥有的更好的选择,截至今天,有许多自定义 ROM 会杀死后台的应用程序。 我已将foregroundService 用于相同目的,并且运行良好。
【讨论】:
ForegroundService
实际上是我的目的的一种也是唯一一种优雅的方式(?),但我仍然不会为此保留粘性通知(位置状态更改) - 它会打扰用户占用屏幕上的宝贵空间,这些实例中的大多数迟早会在我的应用程序甚至系统级别被禁用。只有很少的地理围栏,大部分用户永远不会触发一个,下一个不太大的部分用户一直启用定位服务,所以这个通知对他们来说只是垃圾......以上是关于背景中的地理围栏的主要内容,如果未能解决你的问题,请参考以下文章