java关闭飞行模式代码_我的代码持续切换飞行模式

本文探讨了一款应用中飞行模式切换按钮导致的无限循环问题。该应用通过启动服务来切换飞行模式,并利用BroadcastReceiver更新UI状态。文章分析了问题产生的原因,并探讨了正确的实现方法。

我有一个屏幕(Activity)可以执行以下操作:它有一个切换按钮,可以切换飞行模式;它是通过使用一个派生出新线程的服务来完成的。它还有一个按钮,以完全相同的方式执行完全相同的操作。下面的代码片段没有什么特别之处。当按键被点击时,切换按钮的一切工作正常(如果手机当前不在飞行模式,则飞行模式变为“开”;如果手机当前处于飞行模式,则变为“关”,飞行模式持续切换(飞行模式从“开”切换到“关”,再切换回“开”,然后切换到“关”…),就好像它陷入了一个循环。在互联网上进行了一些研究后,我怀疑这与Android中手机/服务状态的intent/broadcastReceiver被触发的方式有关;因为toggle按钮有两种状态,有效地防止了意图再次被广播。这是对的吗??如果是,用按钮切换飞行模式的正确方式是什么(相对于单选按钮或切换按钮)?

/** 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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值