2011-10-02 2 views
1

서비스에 구현하려는 LocationListener의 인스턴스를 한 번만 사용하도록 다중 활동 앱을 개선하려고합니다. 이 작업을 수행하기 전에 나는 오류 조건 하에서 어떤 일이 발생하는지보기 위해 스텁 활동과 스텁 서비스를 실험 해왔다.서비스 제어를위한 방어 코드

언 바운드가 이미 해제 된 서비스에서 바인딩을 해제하고이 오류가 발생하면 오류가 발생하지 않도록하려면 어떻게되는지 확인하고 싶습니다. 액티비티에는 바인딩/바인딩 해제 단추가 두 개 있습니다. 의도적으로 언 바인드를 두 번 연속해서 실행하면 런타임 오류가 발생합니다.

내가 다시 때어 호출 건너 뛸 아래 코드 '< < < < <'를 표시 지점에서 테스트 할 수 있습니다 어떤 조건 ?

내 활동 코드 서비스는 OK 중지/시작

public void myClickHandler(View target) { 
    switch (target.getId()) { 
    case R.id.bind: 
     Log.d("STAG", "Activity One pressed BIND button"); 
     mServiceConnected = bindService(new Intent(
       "com.nbt.servicetest.LOCATIONSERVICE"), mServconn, 
       Context.BIND_AUTO_CREATE); 
     break; 
    case R.id.unbind: 
     Log.d("STAG", "Activity One pressed UNBIND button"); 
     try{ 
     if (mServconn != null) // <<<< What to put here if already unbound? 
      unbindService(mServconn);} 
     catch(Exception e){ 
      Log.d("STAG", "Exception " + e.getMessage()); 
     } 
     break; 
    } 
} 

ServiceConnection mServconn = new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     Log.d("STAG", "Activity One service connected"); 
     mIbinder = service; 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     Log.d("STAG", "Activity One service disconnected"); 
    } 
}; 

입니다. 모든 관련 줄에 동일한 태그가있는 로그 라인을 서비스 코드에 넣었습니다. 출력은 다음과 같습니다

STAG(2945): Activity One onCreate 
STAG(2945): Activity One onStart 
STAG(2945): Activity One onResume 
STAG(2945): Activity One pressed BIND button 
STAG(2945): Loc service ONCREATE 
STAG(2945): Loc service ONBIND 
STAG(2945): Activity One service connected 
STAG(2945): Activity One pressed UNBIND button 
STAG(2945): Loc service ONUNBIND 
STAG(2945): Loc service ONDESTROY 
STAG(2945): Activity One pressed UNBIND button 
STAG(2945): Exception Service not registered: [email protected] 

나는이 정상입니다, 활동의 onServiceDisconnected()가 호출 결코 극복 있습니다?

답변

1

가장 간단한 방법은 다른 변수 (예 : isServConnBound)를 도입하고 바인딩 및 바인딩 해제 동작 모두에 대한 검사를 추가하는 것입니다. 물론 bindServiceunbindService을 호출 한 후에 변수를 업데이트해야합니다.

+0

이것은 완벽한 조건에서 명백한 방법이지만 '나는 일어날 수 없다'는 문제도 다루고 싶습니다. 필자는 모든 실제 앱의 활동에서 onStart의 바인드와 onStop의 바인딩 해제를 할 것입니다. 모든 예외를 잡는 것은해야 할 것 같네요 – NickT

+0

그게 바로 API 예제 코드가하는 것입니다, 그래서 나는 괜찮다고 생각합니다. 두 개의 스텁 액티비티가 있는데, LocationListener를 구현하는 서비스에 대한 시작/중지시 바인딩/언 바인딩됩니다. 이것은 수신자가 확인한 것으로 보이는 방송 onLocationChanged를 보냅니다. 나는 그것이 새어 나오지 않았는지 확인해야하며, 실제 앱에 그것을 고정시킬 것이다. 감사 – NickT

1

나는 불투명 플래그를 사용하여 vhallac에 동의합니다. 이 접근법에 대한 귀하의 우려는 무엇입니까? 나에게는 두려워 할 것이 없다.

"활동의 onServiceDisconnected()는 결코 호출되지 않습니다"- 그렇습니다. 이는 정상적인 현상입니다. 이 콜백에서 API가 무엇을 말하는지보세요 :

서비스에 대한 연결이 끊어졌을 때 호출됩니다. 이는 일반적으로 서비스를 호스팅하는 프로세스가 손상되었거나 종료되었을 때 발생합니다.

프로세스가 충돌하거나 죽지 않아 예상되는 동작입니다. 더군다나, 당신은 동일한 과정에서 당신의 봉사를했기 때문에, 당신은 이것을 결코 부르지 않을 것입니다. 이는 다른 프로세스 (프로세스 간 통신)에서 실행되는 서비스에 바인딩 할 때 중요합니다.

관련 문제