对于子活动更改父活动数据的情况,我无法找到最佳解决方案。
我有一个包含项目列表的活动A。活动A启动活动B,向用户显示详细信息。用户可以运行操作并创建活动C。活动C为活动A中的列表创建新元素。
数据保存在数据库中,所以传递数据没有问题。我只对通知感兴趣。
通知活动A数据已更改的最佳解决方案是什么
目前我知道两个解决方案:
1) 使用startActivityForResult(..)
和Extras
按活动B和C返回结果。结果将包含消息"datachanged">->true/false。
- 我不喜欢这个,因为我无法直接发送消息
2)在恢复时始终刷新活动A中的数据。
- 这不是在浪费处理吗
3)从活动C向活动A发送意向(广播)
我发现的解决方案几乎肯定是错误的:
4) 以某种全局状态保存
- 没有全局状态(对吗?)。我们不应该这样做,因为有一个额外的抽象层(意图)
5)使用getParent()来使用父活动
- 返回时,父活动可能会被销毁并重新创建
活动之间是否还有其他更轻的消息传递系统类似于活动服务通信中的Handler
和Messanger
。也许不应该有一个,因为它违反了设计?
另一个选项是使用广播或本地广播将通知/事件从C发送到A。
它看起来像:1.活动A加载onCreate中的数据。
-
活动A将广播接收器注册到某个自定义操作"com.mypackage.datachanged"。
-
一旦活动C更改了数据,它就用相同的操作发送广播意图。
这样,如果活动A仍保存在内存中,它的接收器将捕获事件,并在需要时重新加载您的列表。如果活动A被终止,它将在重新创建数据时自动刷新数据。
一些注意事项:1.不要忘记在活动A的onDestroy中取消注册接收器。2.你可以用本地广播代替广播。优点:更好的性能和安全性(你的意图永远不会离开你的应用程序)。
使用startActivityForResult通过B和C发送消息是最好的方法。