Android Geofences是否一直保持活动状态直到被移除/过期,还是只有在我的PendingIntent启动时才会保持活动状态?

10
我即将实施一个带有地理围栏的功能,但在进行任何重要工作之前,我需要知道第一次过渡后地理围栏是否仍然处于活动状态。
该功能的核心是:
每次当我在距离点P x米以内的区域A内时(称之为“区域A”),我希望会发生“操作B”。
我需要知道的是:
1. 我只需添加具有“Geofence.NEVER_EXPIRE”的地理围栏并确保我每次进入指定区域都会获得PendingIntent, 而不受经过时间、重新启动等影响吗?
还是
2. 我必须在退出区域A后重新注册这个地理围栏,以便在下次进入“区域A”时得到通知?
我希望第一种情况成立。

请查看我对类似问题的回答,因为我相信它应该涵盖所有需要根据文档重新注册地理围栏的情况。 - Michael Krause
4个回答

10

好的方案是第一个。如果您使用NEVER_EXPIRE标志创建地理围栏作为过期时间,当它被触发(通过进入或离开)时,您不必重新注册它。我对此100%确定,因为我刚刚完成了有关地理围栏的编码和测试POC。

从文档中可以得知,地理围栏被删除的唯一方式是到达过期时间或设备本身将其删除。

过期时间

地理围栏应该保持活动状态的时间长度。一旦到达过期时间,位置服务将删除地理围栏。大多数情况下,您应该指定过期时间,但您可能希望为用户的家或工作场所保留永久围栏。

要停止地理围栏监视,您需要删除这些地理围栏本身。


我对此100%确定。谢谢@Marcel。 - copolii
当有人说“我对此100%确定”时,我通常会感到害怕……但它仍然有效。 - lelloman
我们现在生活在一个充满怀疑的时代。 - Marcel Falliere
嗨,Marcel,如果我将过期时间设置为1小时,那么1小时后它会调用onExit还是其他什么东西? - Nirmal Prajapat

4
请记住,NEVER_EXPIRE将导致地理围栏在用户卸载应用程序后仍然注册,以防应用程序没有卸载它们。没有办法去除它们。永远不会。因此,建议设置一个到期时间,并在它们在您想要之前过期的情况下再次设置地理围栏。

3
这是一个非常有道理的观点,但我想知道为什么要以这种方式实现。如果卸载了应用程序 X,我们可以确定没有任何东西可用于处理 PendingIntent。 我想知道这是否是一个bug...看起来确实是这样...一旦你从你的设备上卸载了我的应用程序,我在你的手机上就没有任何业务关系了。 - copolii
10
那在文档里有提到吗?你怎么知道这些隔离措施在卸载后仍然存在? - b-ryce
2
这似乎不是真的,因为文档指出,当应用程序被卸载和重新安装时,您必须重新注册地理围栏。如果它们在卸载后仍然保留,那么这将是不必要的。 - Mateus Gondim
1
我知道文档上写的是一回事,但这并不意味着它就是那样工作的。我的答案在撰写时是正确的,并经过测试验证。自那时以来,我认为它已被修复。 - hajons

2

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

android.intent.action.BOOT_COMPLETED

和权限:

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

在AndroidManifest.xml文件中。

另外请记住,即使Google Play服务被杀死+重新启动/升级,系统也会恢复地理围栏,但如果您清除其数据,则不会恢复。同样在开发者文档的“仅在必要时重新注册地理围栏”部分中也提到了这一点。

还请注意,如果用户切换或关闭位置/GPS设置,则所有地理围栏将被删除,并生成由提供的挂起意图生成的意图。在这种情况下,hasError() API将返回true,getErrorCode() API将返回GEOFENCE_NOT_AVAILABLE。


1
请注意,在情况下(即用户在手机设置中禁用位置),所有已注册的地理围栏将被删除。
请注意:该文档顶部有警告:“本类已弃用,请使用LocationServices。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接