设备重启后,Geofences是否在android中保持活动状态

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

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

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

我已经查看了以下三个链接,并且还阅读了相当多的文档,但我无法find一个明确的答案,直接说注册地理围栏持续存在或重启后不会持续存在。

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

Android Geofence最终停止获得过渡意图

Android Geofences在删除/过期之前或仅在我的PendingIntent启动之前保持活动状态

如果有人碰巧知道他们是否坚持重新启动后的答案,或者如果他们没有解决问题,那么我们将非常感激! 我最近的希望是为BOOT_COMPLETED创建一个监听器,并在启动时重新注册它们,但id更喜欢只在必要时才这样做。

非常感谢提前!

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

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

这是显而易见的:

       

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

 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 } } 

值得注意的是,如果您在启动时处于地理围栏中,那么一旦注册了地理围栏,这通常会触发地理围栏的未决意图。

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

希望对某人有所帮助。

  • java.lang.RuntimeException:无法在LoadedApk.makeApplication 实例化应用程序android.app.Application:java.lang.NullPointerException
  • 在android studio中检测到框架
  • Android :: qemu-system-i386.exe。 没有权限
  • HelloAndroid]模拟器-5554已断开连接! 取消'com.example.helloandroid.HelloAndroid活动发布'!
  • 在Android Studio上设置许可validation库
  • 从“app-debug.apk”更改生成的apk名称
  • 如何从CookieManager android获取所有cookie?
  • java.util.Scanner会慢吗?
  • 根据我的经验,地理围栏不会在重启后继续存在。 我按照你的建议使用BOOT_COMPLETED接收器。 它工作正常。

    地理围栏在重启后无法生存。 在其他情况下,您还必须重新注册地理围栏。

    只有当需要的文档调出除BOOT_COMPLETED之外的几种情况时,才需要重新注册地理围栏,您需要重新注册地理围栏。 不幸的是,它含糊不清。

    让我们逐点考虑从Android O开始强加的新背景执行限制 :

    • 设备重新启动

    可以通过在intent-filter中添加以下内容来处理这个问题,因为这些免于隐式广播禁令 :

      

    然后,确保将以下权限添加到清单:

      

    您可能想要捕获Android N中引入的较新的LOCKED_BOOT_COMPLETED意图:

      

    但是,如果你这样做,你还需要用android:directBootAware=”true”标记你的接收器android:directBootAware=”true” 。 这会为您的应用带来分歧 。 即,您访问的任何基于文件的数据都必须使用受设备保护的存储来完成。 它的长短是,如果在设备启动到锁定屏幕时不需要通知,请不要使用LOCKED_BOOT_COMPLETED。

    • 该应用程序已卸载并重新安装

    再次,我们在这里很幸运,因为你可以使用这个明确的意图:

      
    • 应用程序的数据已清除

    这是我不知道的地方。 有一个免于隐式广播禁令的ACTION_PACKAGE_DATA_CLEARED ,但只有在清除了另一个包的数据时才会触发它。 我已经尝试了这一点,并且可以确认在您自己的应用数据被清除时您不会被呼叫。

    • Google Play服务数据已清除

    这可以通过将以下内容添加到您的接收器来处理:

          

    然后将以下代码添加到您的BroadcastReceiver的onReceive方法:

     String action = intent.getAction(); if (TextUtils.equals(Intent.ACTION_PACKAGE_DATA_CLEARED, action)) { Uri uri = intent.getData(); if (uri.toString().equals("package:com.google.android.gms")) { // Code here to handle Google Play services data cleared } } 
    • 该应用已收到GEOFENCE_NOT_AVAILABLE警报

    这是Android通过地理围栏API通知您位置服务不再可用的方式,并通过发送错误和状态代码为GEOFENCE_NOT_AVAILABLE的GeofencingEvent来表示 。

    但是,只需遵循地理围栏文档的模糊建议,您就可以相信您可以在此时重新注册地理围栏。 这可能很糟糕,因为位置服务可能仍然被禁用,这样做会导致更多的GEOFENCE_NOT_AVAILABLE 。 我们需要的是一个挂钩来判断何时切换了位置服务。

    直到Android O,为android.location.MODE_CHANGED_ACTION注册BroadcastReceiver会给你这个钩子。 在Android O及更高版本中,此隐式意图被禁止,并且您的BroadcastReceiver将不再被调用,因此需要另一个钩子。

    对于Android O及更高版本,我发现将JobScheduler与JobInfo.Builder.addTriggerContentUri结合使用以监视Settings.Secure.LOCATION_PROVIDERS_ALLOWED URI可用于此目的,如果当前没有运行调用,它甚至会启动您的应用程序你的JobService。 这种方法要求API> = 24.我已经证实这是有效的,包括Android P(API 28)。

    使用JobScheduler方法的一些注意事项:

    1. 您的应用可能无法立即得到通知,但在我的测试中,它会在几分钟内得到通知。
    2. LOCATION_PROVIDERS_ALLOWED已弃用,可在未来的Android版本中删除。

    因此,如果你的minApi版本为24,那么你可以使用JobScheduler / JobService来获取Settings.Secure.LOCATION_PROVIDERS_ALLOWED钩子。

    但是,如果您不喜欢放弃10%的用户群( 截至撰写本文时,KitKat(API 19)占据了Android活跃用户群的9.1% )并且需要较低的minApi,则您需要同时拥有两个BroadcastReceiver和JobService。