2011-11-13 104 views
5

我有一個Android應用程序,其中的活動激發在後臺運行的長時間運行的操作。這些操作在完成後與活動進行交互。我正在開發一個處理Activity/Long-Running-Task耦合的組件,負責處理被破壞和重新創建的活動。長時間運行Android'服務'

此時該組件是作爲Android服務實現的。這些活動調用bindService並使用生成的IBinder來啓動和跟蹤任務。我決定不使用startService,因爲我更喜歡通過Java接口實現更豐富的API。

現在的問題。活動啓動時,綁定到服務並調用serviceApi.runTask(...)。然後銷燬活動A(例如用戶翻轉手機)並重新創建爲活動A'。一個'然後再次綁定到服務,宣佈其存在,一切都應該運行良好。

除了我的服務被破壞。當活動A被銷燬時,它解除與服務的綁定。 Android看到沒有更多的客戶,並殺死該服務。當活動A'被創建時,服務被再次創建,並且我失去了舊服務所具有的一切。

我能看到的唯一解決方案是使用單例服務。然後它不一定是一個Android服務,只是一個每個人都可以訪問的實例。 Android在這個問題上皺起了眉頭嗎?有沒有更適合這個問題的設計?


Editted:即使我打電話startService,然後綁定到它,沒有什麼保證了服務實例會只要在應用程序運行存在。如果資源不足,Android可以殺死粘性服務。殺死服務會導致應用程序發生故障,而我不能這樣做。

回答

7

即使我打電話startService,然後綁定到它,沒有什麼保證服務實例會只要應用程序正在運行就存在。

正確。

如果資源不足,Android可以殺死粘性服務。

也正確。所有「粘性」意味着Android可能會重新啓動服務。

殺死服務會導致應用程序發生故障,我不能這樣做。

創建一個保證永久運行的服務是不可能的。對於初學者來說,用戶可以隨時擺脫您的服務,因爲用戶憎惡那些毫無意義的服務永遠運行的開發人員。只有在極少數情況下才需要寫永久服務。否則,這只是拙劣的編程。

我能看到的唯一的解決辦法是使用該服務的單。然後它不一定是一個Android服務,只是一個每個人都可以訪問的實例。 Android在這個問題上皺起了眉頭嗎?

當進程終止時,單身(即a。靜態數據成員)將消失。該過程將最終終止,特別是如果沒有活動的服務,並且您的任何活動都不在前臺。

+0

謝謝,Commonware。組件(缺少更好的單詞)我只需要在應用程序啓動並運行時運行,並且用戶正在使用它。一旦用戶關閉應用程序,該組件也可以關閉,因爲其唯一目的是協調過程中異步UI相關的任務。 我確實需要定期檢查服務器更新的服務(我還沒有決定使用C2DM)。我將把它作爲一個短期的服務來實現,在投票後關閉。 – zmbq

0

喲必須創建持久的服務。請參閱this manual

簡而言之 - 不要撥打bindService,請撥打startService