我正在嘗試修改我的多活動應用程序,以便只使用一次我打算在服務中實現的LocationListener實例。在此之前,我一直在嘗試使用存根活動和存根服務來查看在錯誤情況下會發生什麼。控制服務的防禦代碼
我想看看會發生什麼,如果我試圖從已經解除綁定的服務中解除綁定,並在發生這種情況時避免任何錯誤。該活動有兩個按鈕綁定/解除綁定。如果我故意連續兩次打開解除綁定,我會得到一個運行時錯誤。
我可以在下面的代碼跳過再次呼籲解除綁定標註爲「< < < < <」點測試什麼條件?
我的活動代碼是
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