LocationManager.PROVIDERS_CHANGED_ACTION不适用于API 26及更高版本

时间:2018-02-07 08:30:45

标签: android broadcastreceiver

我正在使用以下代码来获取位置开/关事件。

<receiver
    android:name=".receivers.GpsReceiver"
    android:enabled="true">
    <intent-filter>
        <action android:name="android.location.PROVIDERS_CHANGED" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

我正在开发基于地理围栏的应用程序。根据{{​​3}},我们必须在应用收到GEOFENCE_NOT_AVAILABLE警报后重新注册地理围栏。这通常发生在禁用NLP(Android的网络位置提供程序)之后。

通过使用此广播接收器,我在启用Android的网络位置提供程序时重新注册了地理围栏。

但是从API级别26开始,这个广播接收器永远不会工作。看到 Re-register geofences only when required

那么如何在API 26及更高版本中实现相同的任务呢?

注意:即使app在后台,我也需要重新注册地理围栏。

3 个答案:

答案 0 :(得分:5)

您可以切换到Context.registerReceiver()动态注册您的接收器,但恕我直言,没有可靠的方法让他们注册&#34;永远&#34;,因为系统将在某些情况下终止您的进程条件。

当然,您可以使用例如重新注册它们。 white listed broadcast receiversAlarmManagerJobScheduler等。但就电池和其他资源消耗而言,这不是最佳方式。实际上这就是谷歌禁用隐式广播的原因。

重点是:通过禁用Oreo中的隐式广播,Google会强制您使用某种重复性作业来执行此类操作。因此,您不需要倾听NLP状态更新,只需在您的定期作业中反复设置GeofencingClient.addGeofences(如果已启用NLP)地理围栏。

答案 1 :(得分:3)

如您所链接的文章中所述,Android API 26无法监听隐式广播,例如

<action android:name="android.location.PROVIDERS_CHANGED" />

如果应用被杀或当前没有在后台运行。 您可以做的唯一事情是在运行时注册广播接收器,如migration guide中所述。

我所做的是在onCreate的应用程序类中调用registerReceiver并在onTerminate中取消注册它。

class MyApplication : Application() {
  private val gpsReceiver = MyBroadcastReceiver()

  override fun onCreate() {
    super.onCreate()
    registerReceiver(gpsReceiver, IntentFilter("android.location.PROVIDERS_CHANGED"))
  }

  override fun onTerminate() {
    super.onTerminate()
    unregisterReceiver(gpsReceiver)
  }
}

希望这可以帮到你!

答案 2 :(得分:0)

也许您应该尝试使用background servicewakelock在应用关闭/杀死或屏幕关闭时在后台长时间运行。 它适合我:)