Моя цель - иметь виджет «Режим полета» на домашнем экране, чтобы пользователь мог включить / выключить режим полета; виджет отображает текущее состояние режима полета (включен, выключен или находится в переходном режиме). Для этого я регистрируюсь, чтобы прослушивать изменение состояния телефона при обратном вызове 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, кажется, предполагает, что работа слушателя выполнена, и убьет слушателя. Как лучше всего держать слушателя в телефоне, пока не завершится полный цикл перехода? Или есть лучшие способы?