我正在尝试找出正确/推荐的方法,以避免在配置更改期间从长时间运行的服务中丢失错过的事件。例如,我需要避免在旋转设备时活动错过任务完成事件的情况,导致进度微调器保持可见。
我目前正在通过创建一个名为Fragment
的无视图保留EventCollector
来处理此问题,其中包含从服务接收广播的BroadcastReceiver
。活动或任何其他想要接收这些事件的类实现EventCollectorListener
并调用EventCollector.attachListener(TAG, this)
进行注册,并EventCollector.detachListener(TAG)
取消注册以接收事件。分离时,事件将存储在队列中,直到再次调用attachListener()
。 ([1]的实施和[2]的实例)。
正常的事件流程如下:
EventCollector.attachListener()
中的onResume()
来激活自己。onEventReceived()
界面的EventCollectorListener
方法的事件。EventCollector.detachListener()
中调用onPause()
之前将其自行分离。EventCollector
实例中排队。EventCollector.attachListener()
中调用onResume()
,此时会发送所有排队的事件。这有一些缺点,例如如何缓存onPause()
和onResume()
之间的每个事件。例如,如果我的服务正在提取zip存档,那么如果该进程已经完成了80%,则无法保持1%,2%等的进度事件。此外,如果故意销毁活动(例如,后退按钮),事件将继续堆积在队列中。
我觉得我的解决方案非常hacky,而且我似乎正在努力解决Android的工作方式。我没有看到任何人使用这样的解决方案,我认为这是一个相当常见的用例,那么有更好的方法来避免服务错过事件吗?通过使用IntentService
和意图/广播进行通信,我处理长时间运行任务的方法完全错了吗?我是否应该使用绑定服务,如果是这样,一般结构将如何?
我不介意做出重大改变以实施更好的解决方案。
提前致谢!任何反馈都表示赞赏。
参考文献: