2010-11-26 6 views
0

У меня есть экран (Activity), который выполняет следующие действия: у него есть кнопка переключения, которая переключает режим самолета; он делает это, используя службу, которая генерирует новый поток. У этого также есть кнопка, которая делает точно то же самое точно таким же образом. На самом деле нет ничего необычного, поскольку ниже показаны фрагменты кода. Хотя все работает так, как ожидалось, для кнопки переключения (режим самолета меняется на «включено», если в настоящее время телефон не находится в режиме полета, изменяется на «выключено», если в настоящее время находится в режиме самолета), когда кнопка нажата, режим самолета непрерывно переключается (режим полета переключается с «on» на «off» и обратно на «on», а затем на «off» ...), как если бы он попадал в цикл. После некоторых исследований в Интернете я подозревал, что это связано с тем, как намерение/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; 
} 
+0

Я вернулся к своему коду и программным образом переключил режим самолета, и он начал ту же самую сумасшедшую мелодию. Похоже, что это не имело никакого значения, если я использовал фоновый сервис или непосредственно использовал свой служебный класс в этой деятельности. Конечно, если бы я не зарегистрировался в этом намерении, этот цикл не произошел бы; но тогда мой пользовательский интерфейс не будет обновляться, чтобы отразить тот факт, что режим самолета изменился: aimFilter = новый IntentFilter ("android.intent.action.SERVICE_STATE"); – mobileTofu 2010-11-26 18:35:31

ответ

0

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

Смежные вопросы