Android 地理围栏是不是保持活动状态直到删除/过期或仅在我的 PendingIntent 启动之前

Posted

技术标签:

【中文标题】Android 地理围栏是不是保持活动状态直到删除/过期或仅在我的 PendingIntent 启动之前【英文标题】:Do Android Geofences remain active until removed/expired or only until my PendingIntent is launchedAndroid 地理围栏是否保持活动状态直到删除/过期或仅在我的 PendingIntent 启动之前 【发布时间】:2013-07-23 16:34:45 【问题描述】:

我即将使用地理围栏实现一项功能,在完成任何认真的工作之前,我需要知道地理围栏在第一次转换后是否仍然有效。

该功能的核心是:

每次我在点 P 的 x 米范围内(称为 A 区),我想要 行动 B 发生。

我需要知道的是

我是否只需要使用Geofence.NEVER_EXPIRE 添加地理围栏并放心,我会得到一个 PendingIntent每次我进入指定区域,不管经过了多少时间,重启等

我是否必须在离开 A 区后重新注册此地理围栏才能在下次进入 A 区时收到通知?

我希望是前者

【问题讨论】:

请参阅my answer to a similar question,因为我认为它应该涵盖您应该根据文档重新注册地理围栏的所有情况。 【参考方案1】:

好的建议是第一个。如果您使用标志 NEVER_EXPIRE 作为过期时间创建地理围栏,则在触发时(通过进入或退出)您不必重新注册它。我 100% 确定这一点,我现在刚刚完成了关于地理围栏的 POC 的编码和测试。

从文档中,删除地理围栏的唯一方法是达到过期时间或由设备本身删除。

过期时间

地理围栏应保持活动状态的时间。一旦 到期时间已到,定位服务将删除地理围栏。 大多数情况下,您应该指定到期时间,但您也可以 希望为用户的家或工作地点保留永久性地理围栏。

要停止地理围栏监控,请自行移除地理围栏

【讨论】:

我 100% 确定这一点 谢谢@Marcel 当有人说“我 100% 确定这一点”时,我通常会感到害怕......无论如何它都有效 我们现在生活在一个充满怀疑的时代 嗨,Marcel,如果我将过期时间设置为 1 小时,1 小时后它会调用 onExit 或其他什么?【参考方案2】:

请记住,即使在用户卸载应用程序后,如果应用程序没有卸载它们,NEVER_EXPIRE 也会导致地理围栏被注册。没有办法删除这些。曾经。所以他们会不断消耗电池。因此,建议设置过期时间,并重新设置地理围栏,以防它们在您希望它们过期之前过期。

【讨论】:

一个非常有效的观点,但我想知道为什么它是这样实现的。如果应用 X 被卸载,我们确定将无法为 PendingIntent 提供服务。我想知道这是否是一个错误……看起来确实如此……一旦你从你的设备上卸载我的应用程序,我在你的手机上剩下的业务为零。 @hajons 这是在文档中的某个地方吗?你怎么知道这些栅栏在卸载后仍然保留? 这似乎不是真的,因为documentation 说在卸载并重新安装应用程序时您必须重新注册地理围栏。如果它们在不需要的卸载过程中保留。 我知道文档说了一件事,但这并不意味着它就是这样工作的。在撰写本文时,我的回答是正确的,并已通过测试验证。从那时起,我认为它已被修复。【参考方案3】:

请注意,在THIS 情况下(即当用户禁用位置是他的手机设置时)“所有注册的地理围栏都将被删除”。

请注意:该文档顶部的警告“此类已弃用。使用 LocationServices。”

【讨论】:

【参考方案4】:

虽然无论您进入/退出地理围栏多少次,您都会获得待处理的意图(转换),但问题是设备重启将删除您的所有地理围栏。因此,在设备重启的情况下,您必须使用广播接收器再次重新注册所有地理围栏(您将通过共享首选项保存)并设置意图过滤器操作

android.intent.action.BOOT_COMPLETED

和许可:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

在 AndroidManifest.xml 中。

另外请记住,即使 Google Play 服务被终止+重新启动/升级,系统也会恢复地理围栏,但如果您清除其数据则不会。在“仅在需要时重新注册地理围栏”部分下的 developer docs 中也提到了这一点

另外请注意,如果用户切换或关闭位置/gps 设置,所有地理围栏都将被删除,并由提供的待处理意图生成意图。在这种情况下,hasError() api 将返回 true,而 getErrorCode() api 将返回 GEOFENCE_NOT_AVAILABLE。

【讨论】:

以上是关于Android 地理围栏是不是保持活动状态直到删除/过期或仅在我的 PendingIntent 启动之前的主要内容,如果未能解决你的问题,请参考以下文章

Android 地理围栏未触发、导致 GPS 活动或调用 IntentService

地理围栏未触发(未决意图和广播接收器)

Android - 需要添加超过 100 个地理围栏

Android 地理围栏是不是能够在重启后幸存下来?

背景中的地理围栏

仅使用 gps 定位模式的 Android 地理围栏监控