Мой код постоянно переключает режим полета - PullRequest
0 голосов
/ 26 ноября 2010

У меня есть экран (Активность), который выполняет следующие действия: имеет переключатель, который переключает режим полета;это делается с помощью службы, которая порождает новый поток.Он также имеет кнопку, которая делает то же самое точно так же.Нет ничего особенного, как показывают фрагменты кода ниже.Хотя для кнопки переключения все работает как положено (режим полета меняется на «вкл», если в данный момент телефон не находится в режиме полета; меняется на «выкл», если в данный момент находится в режиме полета), когда кнопка нажата, режим полета переключается непрерывно(режим полета переключается из «вкл» в «выкл» и обратно в «вкл», а затем в «выкл» ...), как будто он попадает в петлю.После некоторых исследований в интернете, я подозревал, что это как-то связано с тем, как intent / broadcastReceiver для состояния телефона / службы запускались в Android;поскольку кнопка переключения имела два состояния, которые эффективно препятствовали тому, чтобы намерение было передано снова.Это правильно??Если это так, что было бы правильным способом переключения режима полета с помощью кнопки (вместо радиокнопки или тумблера)?

/** Handler for the button. */
runToggleAirplaneModeServiceBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
    startService(new Intent(SleepScheduleController.this, AirplaneModeService.class));
}
});
/** Handler for the toggle button. */
airplaneModeToggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    startService(new Intent(SleepScheduleController.this, AirplaneModeService.class));
}
});
/** In the same screen as the toggle button and the button.
 * Need this to update the state of the toggle button once 
 * the toggling command is executed.
 */
intentFilter = new IntentFilter("android.intent.action.SERVICE_STATE");
receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        displayAirplaneMode();
    }};
registerReceiver(receiver, intentFilter);

private void displayAirplaneMode() {
    if(airplaneModeToggler.isInAirplaneMode()){
        airplaneModeToggleButton.setChecked(true);
        airplaneModeTextView.setText(R.string.airplane_mode_on);
    }else{
     airplaneModeToggleButton.setChecked(false);
     airplaneModeTextView.setText(R.string.airplane_mode_off);
    }
}

/** Code snippet in AirplaneModeService*/
@Override
public void onCreate() {
    airplaneModeToggler = new AirplaneModeToggler(this);
    Thread mThread = new Thread(null, airplaneModeToggleTask, "AirplaneModeToggleTask");
    mThread.start();
}

private Runnable airplaneModeToggleTask = new Runnable() {
    @Override
    public void run() {
        airplaneModeToggler.toggle(null);
        AirplaneModeService.this.stopSelf();
    }
};

/** Code snippet in the Utility class used by AirplaneModeService.*/
public Boolean toggleAirplaneMode(Boolean enabling) {
    boolean _enabling = enabling == null ? !isInAirplaneMode() : enabling.booleanValue();
Settings.System.putInt(mContext.getContentResolver(),
            Settings.System.AIRPLANE_MODE_ON, 
            _enabling ? AIRPLANE_MODE_ON : AIRPLANE_MODE_OFF);
    Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
    intent.putExtra("state", _enabling);
    mContext.sendBroadcast(intent);
    return _enabling;
}

1 Ответ

0 голосов
/ 27 ноября 2010

Итак, я выследил ошибку.Это вызвано тем, что OnCheckedChangeListener объекта toggleButton повторно выполняет команду в моем коде.Скажем, если команда переключения ранее была вызвана программно или нажатием другой кнопки, то это приведет к изменению проверенного состояния на toggleButton, которое впоследствии выполнит ту же команду переключения, что приведет к другому раунду изменения проверенного состояния накнопка toggle.

...