在我的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