를 통해 백그라운드 서비스의 시작 및 중지를 제어하는 활동이 있습니다. 버튼 클릭. 서비스가 실행 중이 아닌 경우 버튼에 'START SERVICE'라고 표시되고 서비스가 실행 중일 때는 버튼에 '서비스 중지'라고 표시됩니다. 버튼 클릭시 발생할 논리는 동일한 방식으로 토글됩니다 (서비스가 실행 중이 아닌 경우 버튼 클릭시이를 시작하고 바인딩합니다). 서비스가 중지되면 중지하고 서비스가 실행중인 경우 바인드 해제합니다.Android 백그라운드 서비스 상태 정보
자세한 내용은 코드 발췌 부분을 참조하십시오.
바인딩 및 서비스가 현재는 STOP 서비스 버튼을 중지 할 수 있지만
바인딩 해제, 나는 onPause에서 서비스를 바인딩 해제와 onResume에서 리 바인딩하고있다. 이게 말이 돼? onPause 및 onResume 수명주기 메서드는 상당히 자주 호출되므로 바인딩 및 바인딩 오버 헤드가 많이 발생하지만 onPause는 항상 응용 프로그램이 종료되기 전에 호출되므로 서비스 바인딩을 해제하고 누출을 방지하는 가장 좋은 장소라고 생각합니다.
BACK 버튼
나는 또한 BACK 버튼을 누를 때 어떻게해야 할 아니에요. 뒤로 버튼을 누르면 서비스가 백그라운드에서 계속 실행되어야합니까? (Android Music 응용 프로그램과 동일한 동작)? 그렇다면 서비스가 실행중인 정보를 유지하는 올바른 방법은 무엇입니까? (onSaveInstanceState은 BACK 버튼을 누르면 호출되지 않습니다. 응용 프로그램의 상태를 유지하는 가장 깨끗한 방법이 궁금합니다. isServiceRunning 부울 변수)? 활동이 다시 시작될 때이 정보를 사용하여 시작/중지 버튼 (배경 서비스의 상태와 관련하여)에 올바른 텍스트를 설정해야합니다. 하나의 가능한 대안은 서비스 상태 정보 (isServiceRunning)를 저장하지 않고 활동이 정상적으로 완료되도록하는 것입니다. 이 정보를 ActivityManager에서 onCreate로 가져올 수 있습니다. 여기서 실행중인 서비스를 쿼리 할 수 있습니다.
반면에 BACK 버튼을 눌러 서비스를 중지해야하는 경우 서비스 중지를 어디에 구현해야합니까? onDestroy는이 질문에 대한 자연스러운 대답이지만, onDestroy가 활동 재시작 (예 : 오리엔테이션 변경)에 대한 호출을 받기 때문에 문제가 발생합니다.이 경우 서비스를 중지하고 싶지 않습니다.
public class ServiceController extends Activity {
public void onStartClick(View v) {
if (!isServiceRunning) {
button.setText("STOP");
isServiceRunning = true;
startService(...)
bindService(...)
} else {
button.setText("START");
isServiceRunning = false;
unbindService(...)
stopService(...)
}
}
@Override
protected void onResume() {
super.onResume();
if (isServiceRunning) {
button.setText("STOP");
bindService(...);
}
}
@Override
protected void onPause() {
super.onPause();
if (mBoundAccService != null) {
unbindService(...);
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState != null) {
isServiceRunning = savedInstanceState.getBoolean(ID_SERVICE_RUNNING);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(ID_SERVICE_RUNNING, isServiceRunning);
}
}
, 서비스 때문에 startService로 시작됩니다 (활동이 일시 중지 된 동안 서비스와 통신 할 수 없지만 서비스는 계속 실행 중입니다). - 디자인 팁을 찾고있을 때 구현 팁이별로 보이지 않습니다. – Igor