Приемник вещания onReceive срабатывает дважды при изменении местоположения - PullRequest
0 голосов
/ 22 мая 2018

Я хочу знать, когда пользователь выключает свой GPS.Я хочу получать информацию об этом действии в различных видах деятельности.Я сделал Broadcast Receiver для прослушивания изменений состояния 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)
}

1 Ответ

0 голосов
/ 22 мая 2018

Я бы предположил, что эта проблема возникает только на некоторых устройствах (хотя я не уверен на 100% в этом, но это тот случай, когда прослушивание изменений сети через BroadcastReceiver, так что это имело бы смысл).

В любом случае, самым простым решением было бы сделать enum, который содержит текущий State вашего GPS.Только в случае изменения состояния уведомить наблюдателя .Таким образом, onReceive можно вызывать 1000 раз, но ваш Observer получает уведомление только один раз.

...