2011-10-02 64 views
1

我正在嘗試修改我的多活動應用程序,以便只使用一次我打算在服務中實現的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()不會被調用,這正常嗎?

回答

1

最簡單的做法是引入另一個變量,例如isServConnBound,並在綁定和解除綁定操作中添加檢查。當然,記得在致電bindServiceunbindService後更新變量。

+0

這是在完美條件下的顯而易見的方式,但我想要處理'不可能發生'。我可能只是在onStart中綁定,在onStop中解除所有真實應用的活動中的綁定。我想捕捉任何異常可能必須做 – NickT

+0

這就是API示例代碼所做的,所以我想它是可以的。現在我有兩個存根活動,它們在啓動/停止時綁定/解除綁定到實現LocationListener的服務。這發送onLocationChanged廣播似乎被接收器拾起。我只需要確保它不會泄漏,我會將其插入真正的應用程序中。謝謝 – NickT

1

我同意vhallac - 只使用布爾標誌。你對這種方法有什麼擔憂?至於我,沒有什麼可害怕的。至於爲什麼「該activity的onServiceDisconnected()永遠不會被調用」 - 是的,這是正常的。看看這個回調API說的:

當與服務的連接丟失時調用。這通常發生在承載服務的進程崩潰或被殺死時。

您的進程既沒有崩潰也沒有被殺死,所以這是一個預期的行爲。更重要的是,由於你在同一個過程中有你的服務,你永遠不會得到這個稱呼。綁定到在另一個進程中運行的服務(進程間通信)時,這一點很重要。