2013-03-09 83 views
3

我有一項服務從互聯網上下載一些數據,並定期向指標活動發送進度。在處理服務結束時發送結果。服務到活動粘性通信

我有一個問題什麼是實現溝通的持久性的最佳途徑。

  • Messenger或ResultReceiver,我需要將它們包裹到Intent中,並將監聽器列表存儲在服務中。但是在配置更改活動破壞,並且很難維護此列表。

  • LocalBroadcastManager,我需要從消息遷移到意圖,並且在這個類中也沒有粘性發送。所以如果我的進度活動在後臺得到結果,結果將會丟失。

  • BroadcastManager很好,但我不需要廣播我的系統進度和安全問題。

任何想法?

+0

您希望您的應用程序在下載完成後表現如何? – Terry 2013-10-23 16:42:24

+0

我希望能夠正常恢復活動。例如在此活動中顯示數據(或開始結果活動) – 2013-10-23 17:05:23

+0

因此,您希望應用程序可以關閉,下載完成後,它會在屏幕上顯示備份並顯示下載的數據? – Terry 2013-10-23 17:09:15

回答

0

我相信以實現持久性的最好方式是:

  • 服務下載後,您應該保存在一個數據庫或文件數據。

  • 該服務然後發送廣播更新。

  • 如果活動「活着」一切順利,它將轉到數據庫/文件以獲取更新的內容。

  • 如果活動被殺死或什麼的,你只需要確保數據在數據庫/文件,以便當你啓動/重新啓動活動,你可以從數據庫/文件中獲取最新的內容。

  • 下載時保持一個狀態和進度保存在數據庫/文件中的方式相同。

檢查this谷歌I/O會話,它解釋這真的很好。

+0

文件不是答案,它是SD週期的浪費。如果我們想要有幾個流程,那也是一種痛苦。 – 2013-10-23 17:42:39

0

在你的Application類中使用靜態變量(extends Application)。 Inside Service中設置了這個變量。在內部活動你週期性地讀這個變量。

+0

這是一個糟糕的設計, – 2013-10-26 18:36:37

0

您應該使用massenger發送下載進度,因爲它是更安全和更便宜的方法,然後廣播接收器。

+0

如何維護聽衆的列表,而活動更改配置,這不是微不足道的 – 2013-10-28 15:08:21

2

您可能想試試Otto(http://square.github.io/otto/)。

在您的服務中,只要您想與活動進行溝通,就可以使用共享的Bus發佈新活動。您應該在主線程上使用處理程序或主循環程序來執行此操作,因爲您可能正在使用IntentService。該服務也可以作爲製片人。當您的活動重新創建時,當前已知值將被張貼。

您的活動只需要註冊Bus並訂閱正確的活動。暫停時,只需註銷Bus即可。

+0

我第二個奧托。這是一個非常棒的圖書館,聽起來它對你所描述的內容來說是完美的。 – David 2013-10-30 13:29:07