我正在使用以下代码来获取位置开/关事件。
<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在后台,我也需要重新注册地理围栏。
答案 0 :(得分:5)
您可以切换到Context.registerReceiver()
动态注册您的接收器,但恕我直言,没有可靠的方法让他们注册&#34;永远&#34;,因为系统将在某些情况下终止您的进程条件。
当然,您可以使用例如重新注册它们。 white listed broadcast receivers,AlarmManager
,JobScheduler
等。但就电池和其他资源消耗而言,这不是最佳方式。实际上这就是谷歌禁用隐式广播的原因。
重点是:通过禁用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 service和wakelock在应用关闭/杀死或屏幕关闭时在后台长时间运行。 它适合我:)