背景中的地理围栏

Posted

技术标签:

【中文标题】背景中的地理围栏【英文标题】:Geofencing in background 【发布时间】:2020-02-24 18:49:10 【问题描述】:

开始问题:如何在不打开应用程序的情况下添加/删除地理围栏?

当用户关闭位置时,所有地理围栏都会被删除。引入地理围栏时,我正在对其进行测试,并且能够通过处理"android.location.PROVIDERS_CHANGED" 广播在后台添加/删除地理围栏,但分支上仍然有此代码。

目前,由于 API26,此广播在放入清单时不会触发,我们需要为此操作注册(和取消),例如在ActivityService 的运行时。这不是我的情况的解决方案,我想在打开位置时再次添加地理围栏,或者只是阻止删除已经添加的。

我确实看到了针对这种情况的两种解决方案,但都有一些缺陷......

    前台服务 - 在位置开启/关闭时添加/删除地理围栏的粘性服务,Service 可以接收PROVIDERS_CHANGED。但我不喜欢粘着Notification 总是为了这个微不足道的目的... 工作/工作 - 检查位置状态并根据结果添加/删除地理围栏,最后重新安排自己的实例,例如1h,再一次。短期服务(最多 5 秒)不需要有“视觉表示” - Activity 在前景或粘性 Notification - 但几秒钟就足以检查位置状态和使用地理围栏(只是逻辑,非常漂亮快)

我没有测试第二种方法,但这似乎是一种解决方法,肯定效率很低。我想公平地说,在请求许可时,我会告知用户在后台“监听”位置的目的(API29 上也是 ACCESS_BACKGROUND_LOCATION)。那么当应用程序处于后台/被杀死时,我能做些什么来保持这些栅栏活着呢?

【问题讨论】:

【参考方案1】:

ForegroundService 是您拥有的更好的选择,截至今天,有许多自定义 ROM 会杀死后台的应用程序。 我已将foregroundService 用于相同目的,并且运行良好。

【讨论】:

ForegroundService 实际上是我的目的的一种也是唯一一种优雅的方式(?),但我仍然不会为此保留粘性通知(位置状态更改) - 它会打扰用户占用屏幕上的宝贵空间,这些实例中的大多数迟早会在我的应用程序甚至系统级别被禁用。只有很少的地理围栏,大部分用户永远不会触发一个,下一个不太大的部分用户一直启用定位服务,所以这个通知对他们来说只是垃圾......

以上是关于背景中的地理围栏的主要内容,如果未能解决你的问题,请参考以下文章

woocommerce 中的地理围栏产品

Android 地理围栏示例代码中的错误?有人可以确认吗?

iOS蓝色状态栏同时使用地理围栏/背景位置更新来触发通知

地理围栏不再从 ios7 中的终止状态重新启动应用程序?

Android如何知道地理围栏何时过期?

安卓地理围栏