从发送数据服务的活动和屏幕旋转(Send data from service to activity

2019-09-17 08:18发布

我使用的是执行操作,需要回传给启动它的操作的结果的活动的意图服务。

我已经通过几十个类似的职位搜索,但据我所知,所有的解决方案,我发现有一个问题。 他们不处理好屏幕旋转。 假设一个活动开始的意图服务,该服务需要10秒来执行的动作,而在这10秒,屏幕被旋转。 该活动被破坏并创建一个新的。

  1. 使用接收器:它创建了一个内存泄漏,因为接收器绑定到必须销毁活动,使活动永远不会被破坏。
  2. 使用广播:你必须注册一个监听器,并注销监听活动被销毁。 如果广播消息到达后,听众被注销,并注册新活动的听众之前,该消息将永远不会被接受。
  3. 使用消息:同接收器。
  4. 使用与听众共享偏好/数据库:同广播。

我想出了,是有服务解决方案保存在首选项文件的结果,活动定期检查(可以说每200ms)在首选项文件的变化。 因此,当屏幕旋转时,活动停止检查,并重新创建时重新开始。 如果结果是在交付之间,它仍然获取到(重建)的活动。 但是,好像这消耗cpu和执行从SD卡读取不必要的。

另一种解决方案是将有结果保存在首选项文件/数据库服务,并设置它保存它的时候一个全局变量。 该活动有一个听众的喜好文件/数据库。 注册监听器之前,它会检查全局变量,看看结果被屏幕旋转的过程中把(全局变量<currentTimeMillies()),如果属实,得到的结果,如果不是,注册听众。 由于结果可能检查和登记之间的说,这在该活动持有锁,该服务必须获得把结果的块里面做。 这也将工作,但它太复杂。

是否有这样做的,幸存的屏幕旋转的更简单,更优雅的方式?

Answer 1:

看看我这个问题的答案:

如何处理服务和活动(和它的子活动)之间的IPC?

也许这会给你一个想法。

编辑(增加下面的建议):

另一种方法是使用你在活动创建一个接收器。 在屏幕旋转时,操作系统会调用onRetainNonConfigurationInstance(),您可以返回接收器实例,它会被移交给新的活动(见getLastNonConfigurationInstance())。 注意:这些方法已经在4.0被弃用,你可以使用一个片段和setRetainInstance()来实现类似的行为。



文章来源: Send data from service to activity and screen rotation