2016-02-07 274 views
1

我有一個服務和一個Activity(都作爲同一進程的一部分運行)。 根據SO回答,https://stackoverflow.com/a/29101448/1215996。它建議通過Activity參考Service,以便服務可以調用Activity對象上的回調。服務和活動之間的通信

1)以這種方式進行溝通是一個好主意。這不是壞事,因爲它泄露了對活動的引用,它將避免GC,直到Service爲止。

2)我也檢查了Messenger可以用於來回的B/W活動和服務。 AFAIK,如果ActivityService運行在不同的進程中,則應該使用這個命令。當它們作爲同一過程的一部分運行時,使用這種機制不會成爲通信b/w活動和服務的開銷嗎?

什麼是溝通的最佳方式?我的主要目標是在服務中發生某些事件時向服務提供一些消息。

+1

如果您有本地服務使用「本地綁定服務」模式(在您發佈的SO答案中使用的模式相同) – pskink

+0

我調用bindService()方法綁定到服務,我可以調用服務類方法。但問題是反向溝通,這是我的問題。我希望服務通知片段/活動某些事件。 –

+0

反向通信有什麼問題?只需使用'register()'''unregister()'方法,或者使用簡單的'List'客戶端或在register()期間嘗試'android.os.RemoteCallbackList' – pskink

回答

5

絕對不要將活動引用傳遞給比活動壽命更長的任何事物。永遠。不要泄漏活動參考。

在活動和服務之間沒有「最佳方式」進行通信,但有很多選項,您可以選擇最適合您的用例的方法。

活動通常通過發送一個意向與startService與「啓動的服務」進行通信。這通常比「綁定的服務」更受歡迎,因爲它的代碼更少且更直接。以這種方式啓動服務基本上包裝了一些數據供服務自己處理。你可以認爲startService是這樣說的:「嘿,服務,爲我做這個工作」。由於Intent不能包含「可泄漏」的對象引用,因此在這方面是安全的。

對於服務於背溝通的活動:

LocalBroadcastManager

這類似於標準Android廣播機制,但是這些節目永遠不會離開你的應用程序(所以他們不能被截獲其他應用)。

事件總線

谷歌不提供正式比賽項目總線,但也有很多在那裏,從如果你只是搜索「Android event bus」選擇。這些提供的功能使它們比LocalBroadcastManager更易於使用,並且還允許您定義的各種數據廣播的狀態感。您選擇哪一個可能取決於您提供的功能或您喜歡的表達方式。

Bound Service

這類似於Messenger的,但建立在客戶端和服務之間的正式「鏈接」。您可以使用它在相同或不同進程(使用Messenger)之間執行RPC樣式調用。請記住,每次活動進行時(如方向更改),必須解除綁定並重新綁定到服務。這種中斷可能不適合您的活動邏輯。

可能還有其他選項,但這些是我所知道的最常用的選項。

+0

在onCreate()期間傳遞Activity/Fragment引用並在onDestroy()期間取消註冊。我相信這可以是安全的。 –

+0

如果您完全確定其他組件不會對其onDestroy之外的已傳遞活動持有強有力的引用,則應該可以。 –

+0

@SumitTrehan如果您發現此答案有幫助,請接受它作爲正確的答案。 –

相關問題