2011-05-06 70 views
1

從API Level 4及以上版本進行定位和構建。Android - 跨多個活動從本地服務管理綁定/解除綁定的有效方式

現在,我正在處理一個問題,我試圖在多個活動中維護與本地服務的綁定,並在最後一次連接解除綁定時停止服務。

簡而言之,我的服務只是在HandlerThread中調用一個系統服務,該服務可以快速返回給BroadcastReceiver,然後在等待預定時間(至少15秒)後再次進行相同的調用。

假設我有我的基本活動以這種方式創建的onCreate()的第一個鍵我的服務:

Intent service = new Intent(ActivityA.this, MyLocalService.class); 
getApplicationContext().bindService(service, mConnection, BIND_AUTO_CREATE); 

假設也是由於我保持通過攜帶在我的整個屏幕旋轉結合的事實綁定器和連接,我不會從服務中解除綁定,直到活動完成: // onRetainNonConfigurationInstance繼承我的綁定器和連接,因爲我綁定了應用上下文,所以它們是公平的遊戲。

public void onDestroy(){ 
    super.onDestroy(); 
    //using binder, remove callback to service from current activity 
    if(isFinishing(){ 
     getApplicationContext().unbindService(mConnection); 
    } 
} 

我幾乎做這個設置爲任何其他活動,想要聽服務。

我的問題是,最終,一些活動不會立即解除綁定,因此如果服務是自動創建的,服務仍然會按照綁定/解除綁定模式的行爲進行。在解除綁定最後一個活動之前,我必須儘可能地停止我的線程,這會阻止在BG中調用任何系統服務。有沒有更好的方法來管理綁定和解除綁定服務,還是我正在盡我所能地使用當前的設置?另外,由於我的服務(通過活頁夾)被弱引用,這是否會減少我的內存泄漏風險?

回答

1

顯然,它並未取消註冊,原因是我沒有通過旋轉傳遞綁定,並且我使用內部狀態標誌來確定活動是否正在旋轉(設置爲true時onRetainNonConfigurationInstance()被調用)。在大多數情況下,它沒有在onDestroy()中正確讀取狀態。

當onDestroy()中的isFinishing()解析爲true並通過onRetainNonConfigurationInstance()傳遞綁定時,我最終解除綁定,因此服務能夠關閉最後一個解除綁定。