我有一个屏幕(Activity)执行以下操作:它有一个切换按钮,可以切换飞行模式;它通过使用产生新线程的服务来实现。它还有一个按钮,以完全相同的方式完成相同的操作。下面的代码片段显示的确没有什么花哨的东西。虽然切换按钮的一切都按预期工作(如果当前手机未处于飞行模式,飞机模式将变为“开”;如果当前处于飞行模式,则更改为“关闭”),单击按钮时,飞机模式将持续切换(飞行模式从“开”切换到“关”然后回到“开”然后再“关闭”......)好像它落入循环中一样。在对互联网进行一些研究之后,我怀疑这与在Android中触发电话/服务状态的intent / broadcastReceiver的方式有关;因为切换按钮有两个状态,有效地防止意图再次广播。它是否正确??如果是这样,使用按钮(相对于无线电按钮或togglebutton)切换飞机模式的正确方法是什么?
/** 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 :(得分:0)
所以我追踪了这个bug。它是由toggleButton的OnCheckedChangeListener在我的代码中重新排除命令引起的。假设先前以编程方式调用了切换命令,或者通过单击另一个按钮,这些将导致toggleButton上的已检查状态更改,这将随后执行相同的切换命令,这将导致另一轮检查状态更改toggleButton。