设备旋转时丢失广播意图?

时间:2012-05-10 00:54:59

标签: android android-intent android-service

我们有一个网络客户端应用程序,我们正在尝试验证我们处理来自服务器的响应以及设备轮换的方法。基本上,我们这样做,

  1. 活动注册接收器以进行网络响应
  2. 活动通过启动意向服务来启动网络操作
  3. 服务通过广播意图完成来响应
  4. 我们(感知到的)问题是当设备旋转时,活动被破坏/重新创建。在onPause()中未注册活动的接收者与onResume()中重新注册活动的接收者之间的时间内,我们可能已经错过了该服务广播的意图。

    这是一个真正的问题吗?

    如果是这样,我们假设了以下解决方案,

    1. 首先,不要使用意图在活动和服务之间进行通信
    2. 创建两个阻塞队列:网络请求和响应,例如应用程序类
    3. service从请求队列
    4. 启动take()的线程
    5. 活动从响应队列
    6. 启动take()的线程
    7. 活动offer()在想要启动网络操作时进入请求队列
    8. 发布网络操作的结果
    9. service offer()到响应队列
    10. 任何建议表示赞赏,谢谢。

1 个答案:

答案 0 :(得分:0)

是的,这种情况可能会在极少数情况下发生,但如果用户接到电话,肯定会发生这种情况。您的活动将暂停,然后重新开始,如果用户长时间谈话,您的活动将从服务中丢失一堆广播。

我的建议是,在服务等组件的响应需要立即关注的情况下,不得使用广播在应用程序之间进行双向通信。您将使用什么机制取决于具体情况。在我的最新项目中,我使用服务来更新app-widget,在这种情况下,我在服务中使用静态代码来执行某些查询或请求某些操作。

你的想法听起来不错,但它可能隐藏了一个复杂的实现。如果我在你的位置,我会考虑使用名为Bound Services的内置服务机制。到目前为止我还没有使用它,但它似乎满足了你的需求。

修改

因此,基于绑定服务概念,我提出以下流程:

  1. 活动开始,即所谓的粘性服务。
  2. 服务注册接收器以进行网络响应。
  3. 服务使用基于网络响应的所需信息维护Ibinder对象。
  4. 活动在需要时绑定到服务,并使用信息检索Ibinder对象并执行所需的操作。
  5. 当需要结束应用程序时,Activity会停止服务并自行完成。
  6. 希望这会有所帮助......