2010-06-29 78 views
10

我正試圖重構/重新設計一個Android應用程序。目前,我有一個UI活動(Activity 1),它創建了一個DataThread。此線程負責網絡I/O並通過handler與UI活動交互(提供數據)。Android服務與多個活動交互

現在,我想添加另一個活動(帶有視頻的新UI屏幕) - Activity 2Activity 1仍然是主要活動。當用戶點擊Activity 1上的按鈕時,將會調用Activity 2Activity 2的數據也來自DataThread

我的想法是將我的DataThread的邏輯放在Android ServiceDataService)中。我的問題是 - 可以比活動綁定我的DataService在同一時間嗎?有沒有辦法告訴服務只向特定活動提供數據?

歡迎任何其他想法?

在此先感謝。

回答

4

我通常將我的服務綁定到Application類,並且在處理服務之間的通信的應用程序中擁有某種控制器類(例如,我猜...不知道如何命名所有這些模式)無論活動的活動是什麼。

這將涉及編寫您自己的應用程序類並告訴Manifest使用此類。我走進更詳細的關於這個過程在以前的線程:

More efficient way of updating UI from Service than intents?

您可以通過在的onResume發送應用程序類的引用本身(在本例中還解釋跟蹤「當前活動」活動以上)。這可以通過從一個公共基類中派生你的活動來完成,該基類有一個獲取你的應用類的方法(從getApplicationContext轉換),並且在這個基類的onResume中發送一個自己的ref給應用。然後,例如,您可以通過DataServiceController的名稱註冊活動,並且只有在向Controller註冊以接收它們時,纔會將消息發送到當前活動。

+0

我正在尋找這樣的解決方案,有沒有任何工作的例子或鏈接,以獲得有關此實施的更多細節,thx – Sam 2011-06-23 06:54:59

+7

@Rich當您的應用程序終止時,如何綁定它,您如何設法從服務中乾淨地解除綁定在你的應用程序類?由於Application#onTerminate()永遠不會在生產設備上調用,請參閱JavaDoc http://developer.android.com/reference/android/app/Application.html – 2012-02-20 18:23:17

+0

@SvenJacobs我能想到的唯一方法是:讓服務調用' stopSelf()'在一段時間後,所有活動都暫停。在這種情況下,活動必須在服務暫停時告訴服務他們的狀態。活動永遠不會調用'unbindService()',並且服務在每個Activity的每個onResume()上綁定到'applicationContext'。 – OneWorld 2013-07-04 14:48:09

6

絕對多個活動可以綁定到您的服務。你會得到一個綁定的每個onBind()。然後,您的服務將理想地處理與多個活動交互的邏輯,方法是使用服務中的onBind()使用ID或意圖(使用您自己的每個活動的ID作爲額外)來標識它們。然後,您可以讓該服務爲綁定到它的每個活動生成後臺線程。

+3

@JoakimEngstrom爲什麼你不編輯它,所以它更清楚? – SMT 2014-10-30 19:03:43