【问题标题】:Communication with parent Activity, refreshing parent activity与父Activity通信,刷新父Activity
【发布时间】:2014-02-21 13:54:49
【问题描述】:

对于子活动更改父活动数据的情况,我无法找到最佳解决方案。

我有一个包含项目列表的活动 A。活动 A 启动活动 B 以向用户显示详细信息。用户可以运行操作并创建活动 C。活动 C 为活动 A 中的列表创建新元素。

数据保存在数据库中,因此传递数据没有问题。我只对通知感兴趣。

通知活动 A 数据已更改的最佳解决方案是什么?

目前我知道两种解决方案:

1) 活动 B 和 C 使用 startActivityForResult(..)Extras 返回结果。结果将包含消息 "datachanged" -> true / false

  • 我不喜欢这个,因为我无法直接发送消息

2) 在恢复时始终刷新活动 A 中的数据。

  • 这不是浪费处理吗?

3) 将 Intent 从活动 C 发送到活动 A(广播)

我发现的几乎可以肯定是错误的解决方案:

4) 以某种全局状态保存

  • 没有全局状态(对吗?)。我们不应该这样做,因为有一个额外的抽象层(意图)。

5) 使用 getParent() 来使用父活动

  • 父 Activity 可能会在返回时被销毁并重新创建

在活动之间没有其他一些更轻量级的消息系统吗? 活动服务通信中的HandlerMessanger 之类的东西。也许不应该有,因为它违反了设计?

【问题讨论】:

    标签: android android-intent android-activity


    【解决方案1】:

    另一种选择是使用广播或本地广播,以便将通知/事件从 C 发送到 A。

    它看起来像: 1. Activity A 加载 onCreate 中的数据。

    1. 活动 A 将广播接收器注册到某个自定义操作“com.mypackage.datachanged”。

    2. 一旦更改数据,Activity C 就会使用相同的操作发送广播意图。

    这样 - 如果活动 A 仍保留在内存中 - 它的接收器将捕获事件并在需要时重新加载您的列表。如果活动 A 被杀死 - 它会在重新创建时自动刷新数据。

    一些注意事项: 1.不要忘记在Activity A的onDestroy中注销receiver。 2.您可以使用本地广播代替广播。优势:更好的性能和安全性(您的意图永远不会离开您的应用)。

    【讨论】:

    • stackoverflow.com/questions/7887169/… 这个说广播接收器应该在onPause() 中注销。所以看起来我不应该在后台活动时使用广播。
    • 在“销毁活动”部分查看:developer.android.com/training/basics/activity-lifecycle/…。由于您希望接收器在 Activity 处于后台时运行 - 您应该将其视为 bg 线程/长时间运行的操作,就像他们在 android 文档中所说的那样。我同意在大多数情况下接收器将在 onPause 中取消注册,但您的情况有点不同,因此请随意使用广播接收器并享受更好的性能和灵活性。
    • 是的,你是对的。即使我不会取消注册接收器,我也不会收到事件,因为我是生成它们的人,而不是其他应用程序或系统服务。
    【解决方案2】:

    使用 startActivityForResult 通过 B 和 C 发送消息是最好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 2014-02-25
      相关资源
      最近更新 更多