2012-01-09 54 views
36

我有活動和服務。當活動啓動時,即使活動被銷燬,它也會調用startService()使該服務處於活動狀態,並且bindService()與本服務進行通信。Android服務:onBind(意圖)和onUnbind(意圖)只被調用一次

bindService()返回true,調用mService.onBind(),調用ServiceConnection.onServiceConnected()。所有作品。

當我按回退鍵銷燬我的活動時,它調用unbindService(),我的mService.onUnbind()被調用。 (我在這個onUnbind()返回false。)

然後我重新開始這個活動,bindService()返回true,然後mService.onBind()叫!但是ServiceConnection.onServiceConnected()也被稱爲,並且全部重新工作。

它看起來像Dalvik記得我上次返回的是onBind(),並且不再調用onBind()。當我再次摧毀我的活動時,onUnbind()不是也叫。

我可以將此服務綁定到我的活動並將其解除綁定任意次數,但這些方法不會再被調用,直到我通過解除綁定並調用stopService()來銷燬服務。

在文檔中我找不到任何這種行爲的解釋。相反,this figure顯示onBind()onUnbind()應該每次客戶端綁定和解除綁定服務。這個數字可以在this Dev Guide的底部找到。

回答

47

我認爲this(官方開發指南引用的)可以解釋所有的疑問:

多個客戶端可以連接到服務一次。但是,只有當第一個客戶端綁定時,系統纔會調用您的服務的onBind()方法來檢索IBinder。系統然後將相同的IBinder傳遞給綁定的任何其他客戶端,而無需再次調用onBind()。

+21

哦謝謝。不幸的是,我錯過了這個。然而,我發現我可以在'onUnbind()'中返回true,然後'onRebind()'和'onUnbind()'將被調用給下一個客戶端。 – 2012-01-10 04:52:19

+18

該文檔實際上是誤導性的。它說沒有更多的'onBind()'調用完成,但是這隻適用於多個客戶端的情況。 Docs還說:「如果您的服務已啓動並接受綁定,那麼當系統調用onUnbind()方法時,如果您希望下次客戶端綁定到onRebind()時接收到對onRebind()的調用,則可以選擇返回true服務(**而不是接收對onBind()**)的調用「)。只有沒有調用'onBind()'。另一種情況是文檔錯誤。 – Malcolm 2012-04-08 17:17:33

+0

抱歉在@Malcolm中碰到...我有一個關於Binding和unBinding的問題。怎麼樣,如果我把一個ServerSocket線程內的服務,並在活動 - 我把onStart()和onStop()綁定和解除綁定相應。如果我轉移到另一個活動並重新綁定它,它會被重新創建嗎?或者線程仍然是最後一個? – gumuruh 2014-08-20 12:49:44

0

你可以在這裏找到: https://developer.android.com/guide/components/bound-services.html

您可以同時在多個客戶端連接到服務。但是,系統緩存IBinder服務通信信道。換句話說,只有當第一個客戶端綁定時,系統纔會調用服務的onBind()方法來生成IBinder。然後,系統將同一個IBinder傳遞給綁定到相同服務的所有其他客戶端,而無需再次調用onBind()。