与父Activity通信,刷新父Activity。

3
我找不到在子活动更改父活动数据的情况下最好的解决方案。我的Activity A包含一系列项目。 Activity A启动Activity B以向用户显示详细信息,然后用户可以运行操作并创建Activity C。 Activity C为Activity A中的列表创建新元素。由于数据保存在数据库中,因此传递数据没有问题,我只对通知感兴趣。
目前我知道两个解决方案:
1)使用startActivityForResult(..)和Extras从Activity B和C返回结果。结果将包含消息"datachanged"-> true / false。
我不喜欢这个方法,因为我无法直接发送消息。
2)总是在onResume中刷新Activity A中的数据。
这样做浪费处理能力吗?
3)从Activity C向Activity A发送Intent(广播)。
还有其他更轻量级的Activity之间的信使系统吗?类似于Activity-Service通信中的Handler和Messanger。可能不应该有这样的系统,因为这违反了设计原则?
2个回答

2
另一种选择是使用广播或本地广播来从C向A发送通知/事件。
操作步骤如下: 1.在onCreate中,活动A加载数据。 2.活动A向自定义操作“com.mypackage.datachanged”注册广播接收器。 3.当活动C更改数据时,它会发送相同操作的广播意图。
这样的话,如果活动A仍然保留在内存中,则其接收器将捕获事件,并在需要时重新加载列表。如果活动A被杀死,则在重新创建时自动刷新数据。
一些注意事项: 1.不要忘记在Activity A的onDestroy中取消注册接收器。 2.您可以使用本地广播而不是广播。优点为:性能和安全性更好(您的意图永远不会离开您的应用程序)。

这篇文章说广播接收器应该在onPause()中注销。所以当Activity在后台时,看起来我不应该使用广播。 - user364622
请查看以下链接:http://developer.android.com/training/basics/activity-lifecycle/starting.html 中的“销毁 Activity”部分。由于您希望在 Activity 处于后台时接收器仍能运行 - 您应该像 Android 文档中所说的那样将其视为后台线程/长时间运行的操作。我确实同意在大多数情况下,接收器将在 onPause 中取消注册,但您的情况有些不同,因此请随意使用广播接收器,并享受更好的性能和灵活性。 - Ran Nachmany
是的,你说得对。即使我不取消注册接收器,我也不会收到事件,因为是我自己生成这些事件,而不是其他应用程序或系统服务。 - user364622

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接