0

次のことを行う画面(アクティビティ)があります。機内モードを切り替えるトグルボタンがあります。新しいスレッドを生成するサービスを使用してそれを行います。また、まったく同じ方法でまったく同じことを行うボタンもあります。以下のコード スニペットが示すように、特別なことは何もありません。すべてがトグル ボタンの期待どおりに機能しますが (現在、電話が機内モードでない場合は機内モードが「オン」に変わり、現在機内モードの場合は「オフ」に変わります)、ボタンをクリックすると、機内モードが継続的に切り替わります。 (機内モードは「オン」から「オフ」に切り替わり、「オン」に戻り、「オフ」に戻ります...)ループに陥るかのように。インターネットで色々調べた結果、これは、電話/サービス状態のインテント/ブロードキャストレシーバーが Android で起動された方法と関係があると思われます。トグル ボタンには 2 つの状態があり、インテントが再びブロードキャストされるのを効果的に防いだためです。これは正しいです??もしそうなら、ボタンを使用して機内モードを切り替える正しい方法は何ですか (対ラジオボタンまたはトグルボタン)?

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

1 に答える 1

0

だから私はバグを追跡しました。これは、私のコードでコマンドを再実行する toggleButton の OnCheckedChangeListener が原因です。トグル コマンドが以前にプログラムによって、または他のボタンをクリックすることによって呼び出された場合、これらはトグル ボタンのチェック状態の変更を引き起こし、その後同じトグル コマンドを実行します。トグルボタン。

于 2010-11-27T01:28:42.300 に答える