2010-11-26 12 views
0

飛行機モードを切り替えるトグルボタンがあります。それは、新しいスレッドを生成するサービスを使用して行います。また、まったく同じ方法で全く同じことをするボタンもあります。以下のコードスニペットが表示されるので、実際には何も気にしません。トグルボタン(飛行機モードが現在飛行機モードでない場合は飛行機モードが「オン」に変更され、現在飛行機モードでは「オフ」に変更されている場合は飛行機モードが「オン」に変更される)にはすべてが期待どおりに機能するが、ボタンがクリックされると飛行機モードは連続的に(飛行機モードは、ループに入るかのように、「オン」から「オフ」に戻り、「オン」から「オフ」...に切り替わります)。インターネットに関するいくつかの調査の後、私はこれがAndroid/phoneの電話/サービス状態に対するインテント/ broadcastReceiverの発動方法と関係があると思われます。トグルボタンには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; 
} 
+0

私は自分のコードに戻って、プログラムで飛行機モードをトグルして、同じクレイジーなループを開始しました。バックグラウンドサービスを使用したり、アクティビティで自分のユーティリティクラスを直接使用したりしても、それほど大きな違いはありませんでした。もちろん、私がその意図に登録しなければ、このループは起こりません。しかし、私のUIは飛行機モードが変更されたという事実を反映するために更新されません: intentFilter = new IntentFilter( "android.intent.action.SERVICE_STATE"); – mobileTofu

答えて

0

私はバグを追跡しました。私のコードでコマンドを再実行しているtoggleButtonのOnCheckedChangeListenerが原因です。トグルコマンドが以前にプログラムで呼び出された場合、または他のボタンをクリックすると、toggleButtonのチェック状態が変更され、その後同じトグルコマンドが実行され、チェック状態の変更がもう一度オンになりますtoggleButton

関連する問題