2011-11-09 44 views
3

對於過去偶然遇到過類似疑問的人來說,這更多的是關於Android內部的問題。bindService,unbindService,android和非晴天場景

問題在本質上是非常簡單的:

假設我有一個綁定的服務,提供某些功能在其他進程運行的應用程序 - 我怎麼知道,如果請求的功能調用者仍然存在?

假設我有一個遠程服務,實現遠程回調,如提到here,我怎麼能確定還有一個類接收回調?如何進行清潔?綁定是否在應用程序離開/崩潰時自動關閉,它是如何在打開文件或套接字時發生的?

最後:

如果不解除綁定的遠程應用程序崩潰從我的服務,將它繼續運行,即使那是在使用該服務的最後一個應用程序?

感謝所有的提示,傢伙,欣賞它。

回答

1

我剛剛測試過這一點,即使外部組件因無法解除綁定而泄漏ServiceConnection,Android也會終止該服務(假設它尚未用startService啓動,並且未在別處綁定)。 onUnbind和onDestroy將在這種情況下被調用。

至於檢測註冊回調的組件是否仍然存在,我相信CommonsWare是正確的,因爲您應該嘗試回調。但是,您應該能夠喚醒呼叫組件,並將其喚醒。

上有一個回調2種期望的行爲,如果外部組件是死的(使正常的回調會失敗):

  1. 外部組件只需要從如果你的服務接收回調有問題的組件仍然存在。在這種情況下,只需通過嘗試調用死回調函數來吞服(並記錄)拋出的異常。
  2. 當您的服務嘗試回調時,應該喚醒一個不再活動的外部組件。既然你不能通過普通的回調方法來做到這一點,那麼你需要引發一些意圖來喚醒死掉的組件。實現這一點的簡單方法是爲組件提供方法,以便將PendingIntent註冊到您的服務中。如果正常回調失敗,只需發送PendingIntent。外部組件(應註冊爲相關聯的Intent的接收者)將喚醒並適當地響應該意圖,可能通過重新綁定並調用其他方法來檢索失敗回調的結果。一個警告是,如果你允許呼叫者死亡,並且他們預計會醒來,你需要通過startService()啓動自己的服務,並且適當地停止,因爲否則你可能會在你正在做的時候收集它們請求的工作在發射之前PendingIntent
+0

謝謝一束。所以我想最終的方法是時不時地讓我的聽衆「心跳」,並簡單地清理那些引起異常的人。聽起來很不錯,很像網絡。 它也很好地知道,android本身將負責刪除死鏈接。這幾乎可以消除當沒有人對它感興趣時正在運行的進程的問題。 –

+0

無需心跳IMO。查看我在答案中的變化,找到一種方法。 –

0

假設我有一個綁定服務,它爲在其他進程中運行的應用程序提供某些功能 - 我怎麼知道請求功能的調用者是否仍然存在?

你沒有,AFAIK。

假設我有一個遠程服務,實現遠程回調,就像這裏提到的那樣,我如何確定仍然有一個類接收回調?

如果回調對象不再可用(例如,客戶端消失),您應該得到一個RemoteObjectException

如何進行清潔?

我不知道這意味着在這種情況下,對不起。

當應用程序離開/崩潰時,綁定會自動關閉,它是如何在打開文件或套接字時發生的?

是的,雖然你沒有在服務中通知這個事實。

如果遠程應用程序崩潰而沒有從我的服務中解除綁定,它是否會繼續運行,即使這是最後一個使用該服務的應用程序?

我不確定。我希望Android會檢測到這一點並停止服務,但我沒有嘗試過。