서비스에 구현하려는 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()가 호출 결코 극복 있습니다?
이것은 완벽한 조건에서 명백한 방법이지만 '나는 일어날 수 없다'는 문제도 다루고 싶습니다. 필자는 모든 실제 앱의 활동에서 onStart의 바인드와 onStop의 바인딩 해제를 할 것입니다. 모든 예외를 잡는 것은해야 할 것 같네요 – NickT
그게 바로 API 예제 코드가하는 것입니다, 그래서 나는 괜찮다고 생각합니다. 두 개의 스텁 액티비티가 있는데, LocationListener를 구현하는 서비스에 대한 시작/중지시 바인딩/언 바인딩됩니다. 이것은 수신자가 확인한 것으로 보이는 방송 onLocationChanged를 보냅니다. 나는 그것이 새어 나오지 않았는지 확인해야하며, 실제 앱에 그것을 고정시킬 것이다. 감사 – NickT