广播接收器On Receive在位置更改时触发两次

本教程将介绍广播接收器On Receive在位置更改时触发两次的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

问题描述

我想知道用户何时关闭其GPS。我想在不同的活动中了解这一行动。我做了广播接收器来监听GPS状态的变化。但几乎总是当我关闭GPS时,我的updateValue函数会被触发两次。当用户关闭GPS时,怎么收到一次通知?我做错了什么?以下是我的代码。

class GpsStatusReceiver : BroadcastReceiver() {
var observableGpsState: ObservableGpsState? = null

override fun onReceive(context: Context?, intent: Intent?) {
 val locationManager = context?.getSystemService(Context.LOCATION_SERVICE) as LocationManager
 if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
  //GPS Turned on,OK..
 } else {
  if (observableGpsState == null)
observableGpsState = ObservableGpsState.getInstance()
  observableGpsState?.updateValue(GPS_STATUS_TURNED_OFF)
 }
}

companion object {
 val GPS_STATUS_TURNED_OFF = "GPS_TURNED_OFF"
}}

我的观察对象

class ObservableGpsState: Observable(){

fun updateValue(data: Any) {
 synchronized(this) {
  setChanged()
  notifyObservers(data)
 }
}
companion object {
 private val instance = ObservableGpsState()
 fun getInstance(): ObservableGpsState {
  return instance
 }
}}

和(我猜想的)对我的活动很重要:

protected lateinit var observer: Observable

private fun registerGpsObserver(){
 observer = ObservableGpsState.getInstance()
 observer.addObserver(this)
}
private fun unregisterGpsObserver(){
 observer.deleteObserver(this)
}

override fun update(o: Observable?, arg: Any?) {
 MyApplication.get(baseContext).enableGpsDialog(this)
}

推荐答案

我假设此问题只在某些设备上出现(虽然我不是百分之百确定,但通过BroadcastReceiver监听网络更改时就是这种情况,所以这是有意义的)。

无论怎么,最简单的解决方案是创建一个enum,它保存您的GPS的当前State。仅当状态更改时才通知观察者。这样,onReceive可以被调用1000次,但您的Observer只会收到一次通知。

好了关于广播接收器On Receive在位置更改时触发两次的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。

0
没有账号?注册  忘记密码?