簡體   English   中英

Android后台處理,處理結果和Activity生命周期

[英]Android background processing, handle result and Activity lifecycle

我在Android后台處理方面遇到一般性問題,如何正確處理?

想象一下這種情況:

  1. 用戶從Fragment開始Activity。
  2. 片段開始使用IntenService從網絡中獲取數據。
  3. IntentService通過LocalBroadcast系統將結果提供回Fragment。

在此處輸入圖片說明

Fragment中的BroadcastReciever在onResume()/ onPause()中已注冊/未注冊。 一切看起來不錯,但是當用戶在2)之后立即按HOME按鈕時,從IntentService廣播的結果已丟失。 這是因為Fragment在onPasue()回調中未注冊其BroadcastReceiver。

有什么通用模式可以避免此問題? 使用ResultReceiver而不是BroadcastReceiver對於這個prupouse會更好?

我對ResultReceiver感到厭倦,在這種情況下,我將ResultReceiver發送到Bundle中的服務(它實現了Parcelable接口),但是在重新創建Activity之后,由於更改了屏幕方向,ResultReceiver對以前創建的Activity進行了“骯臟”引用,這可能會導致錯誤。

您的IntentService可以在任務完成時創建一個通知,其中有待處理的意圖會返回您的活動,以防您的活動在接收到任務完成廣播之前進入后台。

如果您考慮在任務完成時啟動活動,則在用戶退出應用程序(通過主頁或后退按鈕)后,不建議使用UI模式。 從android開發者網站:

在任何情況下,后台服務需要提醒用戶有關需要響應的事件時,都應使用狀態欄通知。 后台服務永遠不應自行啟動活動以接收用戶交互。 該服務應改為創建狀態欄通知,該狀態欄通知將在用戶選擇時啟動活動。

我只是創建自己的解決方案,但是我不確定那是正確的。 我的解決方案在以下情況下通過靜態緩存提供結果:

一世)

  • 片段啟動IntentService以獲取數據
  • 取消注冊BroadcastReceiver時,用戶按下HOME按鈕並到達結果

II)

  • 片段啟動IntentService以獲取數據
  • 用戶旋轉設備並重新創建了Fragment,在此過程中,未注冊BroadcastReceiver時結果到達

我的答案

此解決方案會消耗內存,因為我們將最后的結果保存在靜態緩存中。 為了保存多個結果,我建議使用Android的LruCache ,但是在這種情況下,您應該為每個請求設置id(例如timestamp?)。

您能檢查我的解決方案是否正確嗎? 它已經過測試並且運行良好,但是我不知道我的方法是否是解決此問題的最佳方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM