Слушайте изменения состояния телефона в appWidget - PullRequest
0 голосов
/ 30 мая 2011

Моя цель - иметь виджет «Режим полета» на домашнем экране, чтобы пользователь мог включить / выключить режим полета; виджет отображает текущее состояние режима полета (включен, выключен или находится в переходном режиме). Для этого я регистрируюсь, чтобы прослушивать изменение состояния телефона при обратном вызове onUpdate в моем провайдере appwidget:

mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE);

и я обновляю пользовательский интерфейс виджета, переопределяя обратный вызов mPhoneStateListener.onServiceStateChanged.

@Override
    public void onServiceStateChanged(ServiceState serviceState) {
        super.onServiceStateChanged(serviceState);

        switch (serviceState.getState()) {
        case ServiceState.STATE_POWER_OFF:
            currentAirplaneModeState = AIRPLANE_MODE_ON;
            Log.d(APP_ID, "serviceState: "+serviceState.getState()+": STATE_POWER_OFF");
            break;
        case ServiceState.STATE_IN_SERVICE:
            currentAirplaneModeState = AIRPLANE_MODE_OFF;
            Log.d(APP_ID, "serviceState: "+serviceState.getState()+": STATE_IN_SERVICE");
            break;
        case ServiceState.STATE_OUT_OF_SERVICE:
            currentAirplaneModeState = AIRPLANE_MODE_IN_UNDETERMINED;
            Log.d(APP_ID, "serviceState: "+serviceState.getState()+": STATE_OUT_OF_SERVICE");
            break;
        case ServiceState.STATE_EMERGENCY_ONLY:
            currentAirplaneModeState = AIRPLANE_MODE_ON;
            Log.d(APP_ID, "serviceState: "+serviceState.getState()+": STATE_EMERGENCY_ONLY");
            break;
        default:
            Log.d(APP_ID, "serviceState: default: "+serviceState.getState());
            break;
        }
        updateWidget(mContext);
    }

Подход обновляет виджет, но не все время. Требуется несколько переходов состояний, чтобы переключить режим полета, но мой виджет часто застревает в режиме «в переходе», потому что, как только приведенный выше код возвращается, Android, кажется, предполагает, что работа слушателя выполнена, и убьет слушателя. Как лучше всего держать слушателя в телефоне, пока не завершится полный цикл перехода? Или есть лучшие способы?

1 Ответ

1 голос
/ 30 мая 2011

Я регистрируюсь, чтобы прослушивать изменение состояния телефона при обратном вызове onUpdate в моем провайдере appwidget

Это никогда не будет надежным и приведет к утечке памяти до того, как произойдет сбой.Предполагается, что AppWidgetProvider, как и любой зарегистрированный в манифесте BroadcastReceiver, будет жить несколько миллисекунд, достаточно долго для обработки onReceive ().Android остановит ваш процесс через некоторое время после этого, если больше ничего не будет поддерживать процесс и если Android потребуется оперативная память.

Или есть более эффективные способы?

ИспользоватьACTION_PHONE_STATE_CHANGED трансляция.Или используйте AlarmManager для проверки статуса через короткий промежуток времени.

...