在配置/方向更改期间避免服务中的错过事件

时间:2015-11-17 03:14:08

标签: android events service long-running-processes

我正在尝试找出正确/推荐的方法,以避免在配置更改期间从长时间运行的服务中丢失错过的事件。例如,我需要避免在旋转设备时活动错过任务完成事件的情况,导致进度微调器保持可见。

我目前正在通过创建一个名为Fragment的无视图保留EventCollector来处理此问题,其中包含从服务接收广播的BroadcastReceiver。活动或任何其他想要接收这些事件的类实现EventCollectorListener并调用EventCollector.attachListener(TAG, this)进行注册,并EventCollector.detachListener(TAG)取消注册以接收事件。分离时,事件将存储在队列中,直到再次调用attachListener()。 ([1]的实施和[2]的实例)。

正常的事件流程如下:

  1. 活动已开始。
  2. 通过调用EventCollector.attachListener()中的onResume()来激活自己。
  3. 活动处理来自onEventReceived()界面的EventCollectorListener方法的事件。
  4. 用户旋转设备。
  5. 活动通过在EventCollector.detachListener()中调用onPause()之前将其自行分离。
  6. 在此期间从服务收到的事件在EventCollector实例中排队。
  7. 重新创建活动并再次在EventCollector.attachListener()中调用onResume(),此时会发送所有排队的事件。
  8. 这有一些缺点,例如如何缓存onPause()onResume()之间的每个事件。例如,如果我的服务正在提取zip存档,那么如果该进程已经完成了80%,则无法保持1%,2%等的进度事件。此外,如果故意销毁活动(例如,后退按钮),事件将继续堆积在队列中。

    我觉得我的解决方案非常hacky,而且我似乎正在努力解决Android的工作方式。我没有看到任何人使用这样的解决方案,我认为这是一个相当常见的用例,那么有更好的方法来避免服务错过事件吗?通过使用IntentService和意图/广播进行通信,我处理长时间运行任务的方法完全错了吗?我是否应该使用绑定服务,如果是这样,一般结构将如何?

    我不介意做出重大改变以实施更好的解决方案。

    提前致谢!任何反馈都表示赞赏。

    参考文献:

    1. https://github.com/chenxiaolong/DualBootPatcher/blob/47f13965adf4793fea784b736475fa912f7c8d27/Android_GUI/src/com/github/chenxiaolong/dualbootpatcher/EventCollector.java
    2. https://github.com/chenxiaolong/DualBootPatcher/blob/47f13965adf4793fea784b736475fa912f7c8d27/Android_GUI/src/com/github/chenxiaolong/dualbootpatcher/switcher/SwitcherEventCollector.java

0 个答案:

没有答案