0

我有一項服務必須從幾項活動中獲得,每項活動都使用ServiceConnectionAndroid:如何判斷綁定服務何時被銷燬?

每個活動在調用服務之前需要檢查服務是否已被使用。所以在服務中我有一個函數(比如getCurrentId()),它返回服務當前正在執行的細節。 然後在客戶端活動,該服務建立連接:

private MyService mService = null; 
private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder binder) { 
     MyService.MyBinder myBinder = (MyService.MyBinder) binder; 
     mService = myBinder.getService(); 
     activeId = mService.getCurrentId(); 
     log.i(TAG, "Service bound"); 
    } 
    public void onServiceDisconnected(ComponentName className) { 
     log.i(TAG, "Service has been killed"); 
     mService = null; 
    } 
}; 

中的按鈕切換綁定到服務:

activity.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 

和解除綁定:

activity.unbindService(mConnection); 

我不是根本不需要撥打startService()

之前,我綁定到服務,我檢查它是否已經生效,它在做什麼:

if (mService == null) 
    activeId = -1; 
else 
    activeId = mService.getCurrentId(); 

問題是,如果活動結合,然後從服務解除綁定,服務onDestroy()方法被調用(我登錄它來確認這一點),這很好。 但是這個不是觸發器onServiceDisconnected()

所以mService永遠不會設置爲null,並且當我得到該if語句時,它愉快地繼續並調用getCurrentId(),它返回以前的任何細節。

我收集onServiceDisconnected()只應該在服務運行的線程意外死亡時被調用,所以當服務被上一次使用unbinding的活動所銷燬時,它不會被調用。

據我所知,該服務沒有被重新使用,我已經記錄了整個服務。

這給了我兩個問題:

是否有其他的回調函數或某種方式,其中一個ServiceConnection被告知其服務已被解除綁定破壞?

如果服務已將銷燬,那我該如何調用它的功能呢?或者是別的什麼事情 - ServiceConnectionBinder以某種方式返回值而不實際調用服務?

回答

0

onServiceDisconnected()只叫

時到服務的連接已丟失。當承載服務的進程崩潰或死亡時,通常會發生這種情況 。

引自Android docs。這似乎是一種非常罕見的情況,並且在通常從服務中解除綁定時不會被調用。

讓我與服務連接的理智,我建議您綁定到該服務的活動onResume方法,並在onPause方法從它解除綁定。

+0

onServiceDisconnected()也在服務被銷燬時(例如,它完成了它的任務)被調用,同時活動仍然被綁定!這並非罕見。但是,當在onUnbind()之後調用onDestroy()時,不會調用onServiceDisconnected。 – Bhiefer

相關問題