我使用的是执行操作,需要回传给启动它的操作的结果的活动的意图服务。
我已经通过几十个类似的职位搜索,但据我所知,所有的解决方案,我发现有一个问题。 他们不处理好屏幕旋转。 假设一个活动开始的意图服务,该服务需要10秒来执行的动作,而在这10秒,屏幕被旋转。 该活动被破坏并创建一个新的。
- 使用接收器:它创建了一个内存泄漏,因为接收器绑定到必须销毁活动,使活动永远不会被破坏。
- 使用广播:你必须注册一个监听器,并注销监听活动被销毁。 如果广播消息到达后,听众被注销,并注册新活动的听众之前,该消息将永远不会被接受。
- 使用消息:同接收器。
- 使用与听众共享偏好/数据库:同广播。
我想出了,是有服务解决方案保存在首选项文件的结果,活动定期检查(可以说每200ms)在首选项文件的变化。 因此,当屏幕旋转时,活动停止检查,并重新创建时重新开始。 如果结果是在交付之间,它仍然获取到(重建)的活动。 但是,好像这消耗cpu和执行从SD卡读取不必要的。
另一种解决方案是将有结果保存在首选项文件/数据库服务,并设置它保存它的时候一个全局变量。 该活动有一个听众的喜好文件/数据库。 注册监听器之前,它会检查全局变量,看看结果被屏幕旋转的过程中把(全局变量<currentTimeMillies()),如果属实,得到的结果,如果不是,注册听众。 由于结果可能检查和登记之间的说,这在该活动持有锁,该服务必须获得把结果的块里面做。 这也将工作,但它太复杂。
是否有这样做的,幸存的屏幕旋转的更简单,更优雅的方式?