2011-05-21 54 views

回答

4

如果服務已經運行,調用startService()不會「重新啓動服務」。它只是發送一個命令,由onStartCommand()中的服務接收。因此,您可以發送觸發服務的命令來代表活動執行某些操作,這可能涉及從服務返回活動的通信(例如,通過Messenger)。或者,正如@Tom Dignan指出的那樣,您可以綁定到該服務。在處理配置更改時要小心一點,比如當用戶旋轉屏幕時。

1

目前(2013年底),有得到一個參考到正在運行的更好的解決方案在Android中使用服務,只需使用像OttoEventBus這樣的庫。

在您的活動,服務於eventbus添加eventbus,實現雙方的onEvent()方法,創建一個或兩個xyzEvent類(xyz =您的活動名稱),註冊活動和服務引用(以下簡稱「本」) 。

在活動總線上發佈針對您活動服務的活動,通過您的服務的onEvent方法發現活動,在活動中發佈新活動,在活動的onEvent方法中發現它:現在您擁有自己的活動服務參考(服務的this)。

所有設置和完成沒有任何大驚小怪。活動和服務相當分離,易於實施。沒什麼特別的。沒有直接的約束,沒有使者,沒有AIDL。只是老式的K.I.S.S原理。

現在您在活動中引用了您的服務,並且可以調用該服務中可用的任何直接方法。

1

要從正在運行的服務中獲取數據(例如,單擊按鈕時),應該使用有界服務,綁定到服務,獲取對服務的引用並調用公共方法。查看更多herehere

要將數據從服務發送到活動,您可以使用處理程序/ Messenger使用線程或廣播意圖和廣播接收器。