0

我有一个与此人相似的问题,但略有不同。在最初的问题中,他说

假设您要启动一个新活动并将当前活动的一些数据传递给它。

第一个答案是关于把东西放在 Extras 中,所以大概他在谈论传递 Intents。

但是,如果您只想在同一活动的两个实例之间传递怎么办?例如,如果您旋转屏幕,活动的“旧”实例将被销毁并创建一个“新”实例。在它们之间传递信息的方式是通过 Bundle。我知道如何使用 onSaveInstanceState.putXXX 和 .getXXX 传递原始数据类型。但是如果我有一个对象数组怎么办?我怎样才能在捆绑中传递这些?Parcelable 和 Serializeable 是我唯一的选择吗?*

*假设我不想使用静态变量

4

1 回答 1

1

基本上我们在这里有几个选择。

选项 1是使用Activity.onSaveInstanceState()方法。在那里,您将所有内容存储到Bundle类的实例中。Bundle 需要简单、可打包或可序列化的类型。您也可以传递数组,但这些必须是这些类型的数组。

选项 2将覆盖Activity.onRetainCustomNonConfigurationInstance()并从那里返回您的数组。此活动的新实例可以通过调用Activity.getLastNonConfigurationInstance()来检索此数组。尽管此选项工作正常,但它已被弃用。这就是第三个选项发挥作用的地方。

选项 3是使用保留的 Fragment。这里的想法是创建一个片段并在该片段的 onCreate() 或 onCreateView() 中调用Fragment.setRetaineInstance(true) 。一旦被调用,这个片段就会被“保留”。如果您旋转您的设备,那么每次新的旋转都会创建新的活动实例,但保留片段的相同实例将被传递给活动的每个新实例。如果您将阵列保留在那里,它将立即在每个新活动实例中可用。这将是一条路要走。

我想指出,选项 1 仍然存在。如果您的应用程序进入后台并且 Android 将其杀死并稍后再次启动,您将把您的数组传递给 onCreate(Bundle savedInstanceState)。与此相反,选项 2 和 3 将失去状态。如果您可以在每次创建活动时重新创建数组,则可以使用选项 2 或 3。

于 2013-08-18T20:38:34.933 回答