如何在不同的Android活动之间交换数据(对象)?

6

如何在不同的Android活动之间正确交换数据或对象?

欢迎屏幕 <-> 主屏幕 <-> 启动程序 <-> 处理数据 <-> 设置

在Android应用程序中拥有多个活动是否正常/推荐? 在我看来,这种应用程序内部的数据交换模型有些奇怪。


可能是重复的问题:如何在Android中的活动之间传递数据? - Bo Persson
4个回答

9

在Android应用程序中有多个活动是正常/推荐的吗?

正常?是的。推荐?这取决于应用程序。

我认为,在应用程序内部具有这种数据交换模型有点奇怪

对于Web应用程序,你会怎么做?嗯,你将模型保存在一个中央位置(服务器)并在主要UI单元(页面)之间的链接中传递小的上下文数据(URL参数)。

对于桌面应用程序,你会怎么做?嗯,你将模型保存在一个中央位置(数据库)并在主要UI单元(窗口)之间的链接中传递小的上下文数据(例如构造函数参数)。

对于Android应用程序,你会怎么做?嗯,你将模型保存在一个中央位置(数据库、ContentProvider等),并在主要UI单元(活动)之间的链接中传递小的上下文数据(Intent extras)。


6

在 Android 开发者页面上有一个概述:

http://developer.android.com/guide/appendix/faq/framework.html#3

总的来说,这取决于您要传递什么类型的数据。但一般来说,如果可能的话,我会选择使用 Intents,因为它们速度快且专为此而建。

这里有一个例子,说明如何使用 Intents 在活动之间传递数据。


4
只在与您正在启动的内容相关的情况下使用“Intent”附加信息。将它们视为在网站页面之间链接时用于URL参数的等效物。特别地,不要在“Intent”附加信息中存储模型数据,因为当您将其从活动传递到活动时,会产生N个副本。此外,“Intents”在内存中存在相当长的时间,有时甚至在活动被销毁后仍然存在,因此内存成本变得更高。 - CommonsWare

4
答案是:这要看情况。
根据应用程序的架构,您可能希望采取以下措施:
- 将数据存储在自定义ContentProvider中,并传递URI引用——如果您的应用程序基于数据库,那么这是正确的方法,因为它允许其他应用程序直接引用您的数据项; - 通过发送包含自定义Intent数据字段内部的数据来使活动之间进行通信——如果您仅使用非常小的数据项,例如名称或URI,那么这是管理事物的简单方法,但是对于更大的数据项,它会出现问题; - 让所有活动都运行在单个进程中,并将数据存储在共享Java对象中——通常不推荐,但适用于特定的应用程序,例如游戏(但请记住与应用程序生命周期有关的问题!)。
我的应用程序倾向于同时使用前两者:数据主要存储在ContentProvider中,但我也使用意图在ContentProvider和活动之间发送带外信息,当这些数据不容易适应ContentProvider API时。

0

按照谷歌的指示在这里执行:http://developer.android.com/resources/faq/framework.html#3

选择: 原始数据类型 非持久化对象 单例类 - 我最喜欢的 :D 一个公共静态字段/方法 一个弱引用对象的HashMap 持久化对象(应用程序首选项、文件、内容提供者、SQLite数据库)


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