在Activity和BroadcastReceiver之间进行通信的正确方法是什么?

时间:2015-03-25 17:45:36

标签: android

我有一个BroadcastReceiver,它监听系统意图,例如Intent.ACTION_PACKAGE_ADDED。当它收到一个时,Activity需要刷新它呈现的数据。 当然,活动可能没有焦点,或者在发生这种情况时甚至可能不会运行。在下次活动获得焦点时“留言”的正确方法是什么?

我想在SharedPreferences中存储一个布尔值,但有些东西告诉我这不是正确的方法。

3 个答案:

答案 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时您要尝试做什么。如果您只想刷新内容,那么正确的方法是使用onResumeonStop来附加广播接收器侦听器。这仅在活动位于前台时才有效,因此每次用户再次输入活动时,您需要重新加载列表以避免此意图在不在前台时到达的情况。

如果您想在未展示自己的用户界面时收听,另一种方法是创建Service,使用Intent收听此BroadcastReceiver。同样,这取决于您接收此事件所需的时刻。

总结一下:

  • 对于前台用户界面:onResume要附加,onPause要分离。
  • 背景:使用Service