24

我正在编写一个应用程序,当有人在安装应用程序的整个生命周期内进入/退出多个站点时,它需要使用地理围栏。

当我第一次安装应用程序时,我的地理围栏实现(非常类似于下面的第二个链接)一切正常,无论是在移入/移出地理围栏时,还是在使用模拟位置来模拟它时,直到设备重新启动。

在重新启动时,模拟位置和实际进出地理围栏似乎都不会触发事件并将未决意图触发到我的广播接收器。

我查看了以下三个链接,并且还阅读了相当多的文档,但我无法在任何地方找到明确的答案,直接说注册的地理围栏在重新启动后仍然存在或不存在。

这些是我在堆栈溢出中查看的链接: Android 地理围栏是否能在重启后幸存下来?

Android Geofence 最终停止获取转换意图

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

如果有人碰巧知道他们是否会在重新启动后坚持下去,或者如果他们没有解决,那将不胜感激!我目前的最后一个希望是为 BOOT_COMPLETED 创建一个侦听器并在启动时重新注册它们,但我更愿意只在绝对必要的情况下这样做。

提前非常感谢!

编辑:虽然我还没有找到明确的(书面)答案,但我很确定 TonyC 先生发布的内容是正确的,并选择了该解决方案。非常感谢托尼C!

如果有人想查看我的解决方案,我会在设备启动时监听启动完成操作,然后重新注册我需要的所有地理围栏。

这是在清单中:

<!-- Listen for the device starting up -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<receiver android:name="com.YOUR.PACKAGE.geofence.BootCompleteReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

然后为其创建一个广播接收器,它将在启动时重新注册地理围栏:

package com.YOUR.PACKAGE.geofence;

import android.app.PendingIntent.CanceledException;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.WakefulBroadcastReceiver;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.location.Geofence;

public class BootCompleteReceiver extends WakefulBroadcastReceiver
{
    private static final String TAG = "BootCompleteReceiver";

    @Override
    public void onReceive(Context context, Intent intent)
    {
        //Do what you want/Register Geofences
    }
}

还值得注意的是,如果您在启动时处于地理围栏内,这通常会在地理围栏注册后触发地理围栏的未决意图。

因此,例如,如果地理围栏启动了一个应用程序,那么当您启动恰好位于地理围栏中的设备时,一旦启动完成广播接收器注册了地理围栏,它也会打开该应用程序,并且位置服务已经确定了您的位置是。

希望这对某人有所帮助。

4

2 回答 2

15

以我的经验,地理围栏无法在重启后存活。正如您所建议的那样,我使用 BOOT_COMPLETED 接收器。它工作正常。

于 2013-11-21T12:41:34.743 回答
12
于 2018-06-15T04:53:44.477 回答