我有一个BroadcastReceiver,它监听系统意图,例如Intent.ACTION_PACKAGE_ADDED
。当它收到一个时,Activity需要刷新它呈现的数据。
当然,活动可能没有焦点,或者在发生这种情况时甚至可能不会运行。在下次活动获得焦点时“留言”的正确方法是什么?
我想在SharedPreferences中存储一个布尔值,但有些东西告诉我这不是正确的方法。
答案 0 :(得分:4)
恕我直言,你在这里有四个不同的问题:留下信息的正确方法是什么?#34;下一次活动获得焦点?
问题#1 :BroadcastReceiver
如何告诉正在运行的Activity
可能感兴趣的事件?
解决方案:使用事件总线(LocalBroadcastManager
,greenrobot的EventBus,Square的Otto),并在总线上发送来自接收器的包添加事件。您的活动可以在总线位于前台时从总线注册,并且可以在收到您的活动时更新其对数据的查看。
问题#2 :广播发生时,BroadcastReceiver
如何更新SQLite数据库中的模型数据?
解决方案:将此事件以及事件总线逻辑的接收方一侧委托给IntentService
,因为您需要一个后台线程来执行数据库I / O.在工作完成后将事件发布在公交车上。
问题#3 :那么,如果我的活动在事件结束时不在前台,但活动存在(即,是否在后台)会发生什么?
解决方案:在onResume()
中重新加载您的数据,或使用某种"粘贴"公共汽车的事件。 LocalBroadcastManager
不提供此功能,但greenrobot的EventBus具有粘性事件的概念,而Square的Otto具有相关的@Producer
结构。
问题#4 :如果我根本没有活动实例会怎样?例如,当我的进程没有运行时添加了包,所以Android为我分配了一个进程并调用我的接收器,但是我现在的进程中根本没有UI代码?
解决方案:不做任何特别的事。您现有的"加载数据"逻辑将处理这种情况。
答案 1 :(得分:2)
一个简单的解决方案可以是Broadcastreceiver中的静态变量标志。一旦接收器接收到intent,make flag = true。
获取焦点时的活动可以查看此静态变量,并可以相应地刷新数据并将此静态标志设置为false。
答案 2 :(得分:0)
这取决于收到Intent
时您要尝试做什么。如果您只想刷新内容,那么正确的方法是使用onResume
和onStop
来附加广播接收器侦听器。这仅在活动位于前台时才有效,因此每次用户再次输入活动时,您需要重新加载列表以避免此意图在不在前台时到达的情况。
如果您想在未展示自己的用户界面时收听,另一种方法是创建Service
,使用Intent
收听此BroadcastReceiver
。同样,这取决于您接收此事件所需的时刻。
总结一下:
onResume
要附加,onPause
要分离。Service