围栏未注册 - google 意识 API

Fences not registering - google awareness API

我目前正在我的应用程序上注册位置围栏,类似于 documentation 上的解释。使用日志,我可以看到正在正确调用注册回调和广播接收器。但是,如果我重新 运行 应用程序,这些不会被触发。重新启动我的 phone 后,它再次工作。

我没有取消注册围栏,因为我希望即使在后台也能发射围栏(接收器未绑定到 Activity)。

¿即使我在应用程序开发过程中多次重新 运行 应用程序,我如何才能使它正常工作? ¿如何确保在用户重新安装或更新应用程序时正确注册围栏?

我使用

创建 AwarenessFence
AwarenessFence allLocations = AwarenessFence.or(locationFences);

其中 locationFences 是这样创建的 LocationFence 个对象的集合

singleLocationFence = LocationFence.entering(latitude, longitude, FENCE_RADIUS); 

我已经在服务中完成了围栏处理,因为服务可以 运行 在后台工作,所以工作正常。如果 "onDestroy" 被调用,我曾经取消注册围栏,所以操作系统将不再需要观察这些围栏。 该服务还解决了您的 "rerun"-问题,因为它一次只能提供服务。

你的下一个观点

AwarenessFence allLocations = AwarenessFence.or(locationFences);

它的工作原理,我用 TimeFence

试过了
AwarenessFence allLocations = AwarenessFence.or(TimeFence.inInterval(new Date()), Long.MAX_VALUE));

但更好用

AwarenessFence allLocations = locationFences;

因为 AwarenessFence 是所有 BeaconFence、Geofence、TimeFencee 的父级,(...) 形成了 Awareness API。

我了解到,在您使用 Awareness API 注册 fences 之后,即使您 re-run 应用程序,或者如果应用程序在后台,您也希望收到回调。 这个问题没有澄清这一点,但我相信如果你正在关注文档,你正在注册 broadcastreceiver dynamically.

您可以通过添加 something like this in the manifest file:

对您的广播接收器进行静态注册来达到您的目的
<receiver android:name="MyReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED">
       </action>
    </intent-filter>
</receiver>

这样,您就不需要在 onDestroy() 中注销接收器,如果您注册了围栏,您的应用程序将获得围栏回调,即使应用程序已停止或更新。