我有一个类似于this guy的问题,但略有不同。在最初的问题中,他说
假设您要启动一个新活动并从中传递一些数据 目前的活动。
第一个答案是关于将内容放入Extras,所以可能他正在谈论传递Intents。
但是,如果您只想在同一活动的两个实例之间传递,该怎么办?例如,如果旋转屏幕,则会销毁活动的“旧”实例并创建“新”实例。在这些之间传递信息的方法是通过Bundle。我知道如何使用onSaveInstanceState.putXXX和.getXXX传递原始数据类型。但是,如果我有一个对象数组怎么办?我怎样才能在Bundle中传递这些内容? Parcelable和Serializeable是我唯一的选择吗?*
*假设我不想使用静态变量
答案 0 :(得分: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。