【发布时间】:2010-08-04 14:27:21
【问题描述】:
例如,我希望我的用户能够单击“获取新报价”按钮,这将在数据库中开始一个新行以开始存储数据,但我不确定如何独立存储活动(或交叉活动)数据,例如行的 _id,当后续活动中的新数据可用时,我需要重新查询和更新行。这个机制叫什么名字,是怎么做的?
【问题讨论】:
标签: java android sqlite session
例如,我希望我的用户能够单击“获取新报价”按钮,这将在数据库中开始一个新行以开始存储数据,但我不确定如何独立存储活动(或交叉活动)数据,例如行的 _id,当后续活动中的新数据可用时,我需要重新查询和更新行。这个机制叫什么名字,是怎么做的?
【问题讨论】:
标签: java android sqlite session
如何在单个应用程序中的活动/服务之间传递数据?
这取决于您要共享的数据类型:
原始数据类型 要在应用程序中的活动/服务之间共享原始数据,请使用 Intent.putExtras()。要传递需要持久化的原始数据,请使用Preferences 存储机制。
非持久性对象 为了在短时间内共享复杂的非持久性用户定义对象,建议采用以下方法:
android.app.Application 类
android.app.Application 是需要维护全局应用程序状态的基类。可以从任何 Activity 或 Service 通过 getApplication() 访问它。它有几个生命周期方法,如果你在 AndroidManifest.xml 中注册它会被 Android 自动实例化。
公共静态字段/方法
使数据可跨活动/服务访问的另一种方法是使用公共静态字段和/或方法。您可以从应用程序中的任何其他类访问这些静态字段。要共享一个对象,创建对象的 Activity 会设置一个静态字段以指向该对象,而任何其他想要使用该对象的 Activity 只需访问该静态字段。
对象弱引用的 HashMap
您还可以将 WeakReferences 的 HashMap 用于具有 Long 键的对象。当一个 Activity 想要将一个对象传递给另一个 Activity 时,它只需将该对象放入映射中并通过 Intent Extras 将密钥(这是一个基于计数器或时间戳的唯一 Long)发送给接收者 Activity。接收者活动使用此键检索对象。
单例类
使用静态 Singleton 有很多好处,例如您可以引用它们而无需将 getApplication() 强制转换为特定于应用程序的类,或者麻烦地在所有应用程序子类上挂一个接口,以便您的各种模块可以参考那个接口。
但是,静态的生命周期并不能完全由您控制;所以为了遵守生命周期模型,应用程序类应该在应用程序类的 onCreate() 和 onTerminate() 方法中初始化和拆除这些静态对象
持久对象 即使应用程序似乎继续运行,系统也可能会选择终止其进程并稍后重新启动它。如果您有数据需要从一个活动调用持续到下一个活动调用,则需要将该数据表示为状态,当活动被告知它可能会消失时,该状态会被保存。
对于共享复杂的持久性用户定义对象,推荐以下方法:
Application Preferences
Files
contentProviders
SQLite DB
如果需要跨应用程序进程可能被终止的点保留共享数据,则将该数据放在持久性存储中,如应用程序首选项、SQLite DB、文件或内容提供程序。有关如何使用这些组件的更多详细信息,请参阅数据存储。
【讨论】:
android.app.Application class