【问题标题】:Send data from service to activity and screen rotation将数据从服务发送到活动和屏幕旋转
【发布时间】:2012-05-19 09:52:03
【问题描述】:

我正在使用一个 Intent 服务来执行一个动作,并且需要将动作的结果传回启动它的活动。

我已经搜索了几十个类似的帖子,但据我所知,我找到的所有解决方案都有问题。他们不能很好地处理屏幕旋转。假设一个活动启动了 Intent 服务,该服务需要 10 秒来执行该操作,并且在这 10 秒内,屏幕会旋转。 Activity 被销毁并创建一个新的。

  1. 使用接收器:它会造成内存泄漏,因为接收器绑定到必须销毁的活动,因此活动永远不会被销毁。
  2. 使用广播:您必须注册一个监听器,并在活动被销毁之前取消注册监听器。如果广播消息是在监听器未注册之后到达,并且在新活动的监听器注册之前,则永远不会收到该消息。
  3. 使用消息:与接收者相同。
  4. 将共享首选项/数据库与侦听器一起使用:与广播相同。

我想出的解决方案是让服务将结果保存在首选项文件中,并定期检查活动(假设每 200 毫秒)以查看首选项文件中的更改。因此,当屏幕旋转时,活动停止检查,并在重新创建时重新开始。如果结果是在两者之间传递的,它仍然会到达(重新创建的)活动。但是,这似乎会消耗 cpu 并从 SD 卡执行不必要的读取。

另一个解决方案是让服务将结果保存在首选项文件/数据库中,并将全局变量设置为保存它的时间。该活动有一个首选项文件/数据库的侦听器。在注册监听器之前,它会检查全局变量以查看是否在屏幕旋转期间放置了结果(global var

有没有一种更简单、更优雅的方法来完成屏幕旋转?

【问题讨论】:

    标签: android android-service android-activity


    【解决方案1】:

    看看我对这个问题的回答:

    How to handle IPC between a service and an activity (and its subactivity)?

    也许这会给你一个想法。

    编辑(添加以下建议):

    另一种方法是使用您在活动中创建的接收器。在屏幕旋转时,操作系统将调用 onRetainNonConfigurationInstance(),您可以在其中返回 Receiver 实例,并将其移交给新的 Activity(请参阅 getLastNonConfigurationInstance())。注意:这些方法在 4.0 中已被弃用,您可以使用 Fragment 和 setRetainInstance() 来实现类似的行为。

    【讨论】:

    • 我喜欢您将我重定向到的答案。我使用了我编写的第二个解决方案,使用首选项并且根本没有全局变量。问题是首选项不能保存所有类型的数据(Bundles、Parcelables、BigDecimals 等),这迫使我不断地在字符串之间进行转换。您的解决方案似乎更加优雅,没有使用 SD 卡,没有严重的内存消耗(乍一看),一切都干净整洁。我还为 IntentService 通信实现了一个基类。顺便说一句,我希望与 Android 1.6(API 级别 4)兼容,所以我尽量不使用片段,甚至不使用 ACL。
    • 很高兴为您提供帮助,也很高兴该解决方案对您有用!
    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2013-07-28
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多