我可以ArrayList<HashMap<String, String>>
捆绑保留吗?
我想ListView
在旋转屏幕后立即显示。
您不必将其保存在Bundle
. 事实上,这似乎有很多信息要存储在Bundle
.
由于您只是保存一个HashMap
对象String
,因此您可以创建一个类来为您缓存它或使其成为static
类中的一个字段。
静态字段只要不包含对Activity
or a View
or的引用就可以使用Drawable
。(这可能会导致内存泄漏)
您可以执行此操作的最简单方法可能是:
private static HashMap<String,String> myMap = new HashMap<String,String>();
因为这个字段是static
,所以当你的活动被重新创建时,它不会被重新创建。相反,它仍然会在那里供您使用相同的值。
更多数据存储方式:
(这些技术也适用于通过配置更改共享数据)。
http://developer.android.com/guide/faq/framework.html#3
如何在单个应用程序中的活动/服务之间传递数据?
这取决于您要共享的数据类型:
原始数据类型
要在应用程序中的活动/服务之间共享原始数据,请使用 Intent.putExtras()。为了传递需要持久化的原始数据,请使用 Preferences 存储机制。
非持久对象
对于短期共享复杂的非持久性用户定义对象,建议采用以下方法:
单例类
您可以通过使用单例来利用您的应用程序组件在同一进程中运行这一事实。这是一个设计为只有一个实例的类。它有一个名为 getInstance() 的静态方法,它返回实例;第一次调用此方法时,它会创建全局实例。因为所有调用者都获得相同的实例,所以他们可以将其用作交互点。例如,活动 A 可以检索实例并调用 setValue(3);稍后的活动 B 可能会检索实例并调用 getValue() 以检索最后设置的值。公共静态字段/方法
使数据可跨活动/服务访问的另一种方法是使用公共静态字段和/或方法。您可以从应用程序中的任何其他类访问这些静态字段。要共享一个对象,创建对象的活动会设置一个静态字段以指向该对象,任何其他想要使用该对象的活动只需访问该静态字段。
对象弱引用的 HashMap
您还可以使用弱引用的 HashMap 到具有长键的对象。当一个 Activity 想要将一个对象传递给另一个 Activity 时,它只需将该对象放入映射中并通过 Intent Extras 将密钥(这是一个基于计数器或时间戳的唯一 Long)发送给接收者 Activity。接收者活动使用此键检索对象。
持久对象
即使应用程序似乎继续运行,系统也可能会选择终止其进程并稍后重新启动它。如果您有数据需要从一个活动调用持续到下一个活动调用,则需要将该数据表示为在通知活动可能会消失时由活动保存的状态。
对于共享复杂的持久性用户定义对象,建议采用以下方法:
- 应用偏好
- 文件
- 内容提供者
- SQLite 数据库
如果共享数据需要跨应用程序进程可能被终止的点保留,则将该数据放在持久存储中,如应用程序首选项、SQLite DB、文件或内容提供程序。有关如何使用这些组件的更多详细信息,请参阅数据存储。
您可能应该覆盖 Activity 或 Fragments onSaveInstanceState(Bundle) 函数。这将允许您设置您希望在相同 Activity 或 Fragment 的实例之间保存的任何数据。这是在旋转之间保存的正确方法。
** 更新 **
由于您有一个包含 1 个或多个 Hashmap 的 ArrayList,因此您可能需要将两个对象保存到包中。一个是数组中 HashMap 的数量,然后是每个 HashMap。由于 HashMap 是可序列化的,因此您只需使用 Bundle.putSerializable 将每个 HashMap 放入包中。您需要将所需信息放入包中,以便在 OnResume() 中重新创建 ArrayList。
一种方法可能是这样:让每个 HashMap 的键是每个 HashMap 的某个字符串,例如“Hashmap1”、“Hashmap2”等。然后,如果您知道要从包中检索的 HashMap 的数量和密钥格式,那么您可以重新创建 ArrayList。