2010-11-26 3 views
0

다음과 같은 화면 (활동)이 있습니다. 비행기 모드를 토글하는 토글 버튼이 있습니다. 새 스레드를 생성하는 서비스를 사용하여 수행합니다. 또한 정확하게 똑같은 방식으로 정확히 동일한 작업을 수행하는 버튼이 있습니다. 아래에있는 코드 스 니펫만큼 멋진 것은 없습니다. 모든 것이 토글 버튼에 대해 예상대로 작동하지만 (현재 비행기가 비행기 모드에 있지 않으면 비행기 모드가 "켜짐"으로 변경되고 현재 비행기 모드에 있으면 "꺼짐"으로 변경됨), 버튼을 클릭하면 비행기 모드가 계속 토글됩니다 (비행기 모드는 마치 루프에 빠지는 것처럼 "켜짐"에서 "꺼짐"으로 전환하고 다시 켜짐에서 "꺼짐"으로 전환됩니다.) 인터넷에 대한 조사가 끝난 후, 나는 이것이 안드로이드에서 전화/서비스 상태에 대한 intent/broadcastReceiver가 시작된 방식과 관련이 있다고 의심했다. 토글 버튼에는 두 가지 상태가 있었기 때문에 의도를 효과적으로 다시 방송 할 수 없었습니다. 이 올바른지?? 그렇다면 버튼 (라디오 버튼 또는 토글 버튼)을 사용하여 비행기 모드를 전환하는 올바른 방법은 무엇입니까?내 코드가 비행기 모드를 계속 토글합니다.

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

관련 문제