在我的Android應用程序中,我有一個簡單的帶有適配器的列表視圖。有一個沉重的查詢是用數據填充列表視圖。所以我把它放到一個在另一個線程中運行的IntentService中。IntentService完成時從Activity啓動IntentService並刷新活動
IntentService通常單獨運行,僅用於查詢某些數據並將其插入到SQLite數據庫中。
但現在我想有以下可能性:
- 活動與startService啓動IntentService()。
- IntentService完成繁重的工作。
- 當IntentService完成後,它應該通知活動結果,以便可以刷新活動以顯示新數據。
這可能嗎?在這個主題上,我在Stack Overflow上閱讀了很多問題。但是在每個問題上,還有另一個解決方案。所以我想問問大家:哪種解決方案最適合我的目的?
- 將IntentService綁定到Activity似乎並不是最好的解決方案,因爲可能與活動的配置更改等有衝突。正確嗎?
- This blog post建議使用AIDL和Parcelables - 這對我來說聽起來很複雜。有一種更簡單的方法,不是嗎?
- 可以在活動中設置一個廣播接收器,並在完成時在IntentService中觸發此廣播。
- 有人說你應該把use createPendingResult() to pass a PendingIntent給IntentService。如果IntentService在其extras中找到PendingIntent,它將使用它在Activity中觸發onActivityResult()。這是選擇的方式嗎?
非常感謝您提供此解決方案和詳細說明!我是否必須在Android清單文件中註冊ResultReceiver或自定義Intent?我可以把像ArrayList或Cursor這樣的東西放入結果包嗎?我需要那裏的包裹嗎? – caw 2012-02-01 09:43:49
ResultReceiver不需要在清單中註冊,但我確實已將自定義Intent註冊爲我的用途。只要有一個Intent傳遞ResultReceiver,就可以以任何你想要的方式調用IntentService。至於resultBundle,你可以把任何東西放在那裏,一個Bundle可以處理。 – Squonk 2012-02-01 10:22:09
有趣的是,兩個相似的線程都得到了使用ResultReceiver的公認解決方案,但官方的方式似乎是LocalBroadcastManager。我認爲LocalBroadcastManager是首選的原因,因爲如果活動被破壞然後重新啓動,ResultReceiver可能會被銷燬? – 2015-12-23 02:53:51