2010-12-14 3 views
0

를 통해 백그라운드 서비스의 시작 및 중지를 제어하는 ​​활동이 있습니다. 버튼 클릭. 서비스가 실행 중이 아닌 경우 버튼에 '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); 
} 
    } 

답변

0

첫째로, 나는 unPinding onPause() 개념을 이해하지 못했습니다. 이렇게하면 서비스가 시작되고 중지됩니다 (서비스는 본질적으로 활동 임).

내 응용 프로그램의 기능입니다.

사용자가 (명백하게) 활동에서 시작을 선택하면 서비스가 다음 코드로 시작되었습니다.

startService (새 인 텐트 (this, MyService.class));

사용자가 (동일한 버튼이나 다른 버튼 중)

stopService (새 텐트 (이, MUMService 중지를 선택하는 경우.수업));

서비스 클래스에서 서비스 프로세스를 제어하기 위해 onStart 및 onDestroy 메서드를 구현했습니다.

(

@Override

공공 부울 onKeyDown에를 내가 뒤로 버튼을 무시하지 않았다 (이 안드로이드에 의해 권장하지 않습니다)하지만 .. 필요하다면 여기에 코드 (활동에)입니다 INT 키 코드, KeyEvent를 이벤트) {

경우 (keyCode가 == KeyEvent.KEYCODE_BACK) {서비스를 중지하지 않습니다 onPause에서 바인딩 해제

+0

, 서비스 때문에 startService로 시작됩니다 (활동이 일시 중지 된 동안 서비스와 통신 할 수 없지만 서비스는 계속 실행 중입니다). - 디자인 팁을 찾고있을 때 구현 팁이별로 보이지 않습니다. – Igor

관련 문제