What’s onCreate (Bundle savedInstanceState)

谁能帮助我了解 onCreate(Bundle savedInstanceState)中的 Bundle savedInstanceState,我是 Android 的新手。我试着从 developer.android.com 的角度去理解。但我无法理解。有人能简化一下吗?

155540 次浏览

当活动第一次开始时,onCreate(Bundle savedInstanceState)将得到 Bundle null,当活动方向改变时,它将被使用... ... 。

Http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

Android 提供了另一种优雅的方式来实现这一点。要实现这一点,我们必须重写一个名为 onSaveInstanceState()的方法。Android 平台允许用户保存任何实例状态。实例状态可以保存在 Bundle 中。Bundle 作为参数传递给 onSaveInstanceState 方法。

我们可以从作为参数传递给 onCreate方法的 Bundle 中加载保存的实例状态。我们还可以在 onRestoreInstanceState方法中加载保存的实例状态。但是我会留给读者去发现。

如果您将应用程序的状态保存在一个 bundle 中(通常是非持久化的,动态的数据在 onSaveInstanceState中) ,如果需要重新创建活动(例如,方向改变) ,它可以被传递回 onCreate,这样您就不会丢失先前的信息。如果没有提供数据,则 savedInstanceState为空。

你 应该使用 onPuse ()方法来编写任何持久数据(例如 用户编辑)存储。此外,该方法 OnSaveInstanceState (Bundle)在将活动放入 这样的背景状态,允许您保存任何动态 将您的活动中的实例状态转换为给定的 Bundle,以便稍后使用 如果需要重新创建活动,则在 onCreate (Bundle)中接收。 请参阅过程生命周期部分以获得更多有关 流程的生命周期与其托管的活动有关 重要的是要将持久数据保存在 onPuse ()中,而不是 OnSaveInstanceState (Bundle) ,因为后者不是 生命周期回调,因此不会在每种情况下调用 文件所述。

来源

当活动首次启动时调用 onCreate(Bundle)。您可以使用它来执行一次性初始化,例如创建用户界面。onCreate()接受一个参数,这个参数要么为 null,要么是 onSaveInstanceState以前保存的一些状态信息。

如果您的 Activity 在上面描述的场景(可视化视图)中被终止,则调用 onCreate (Bundle savedInstanceState) ,savedInstanceState 将是非空的。然后你的应用程序就可以抓取 (catch)来自 savedInstanceState 的数据并重新生成 Activity

正如 Dhruv Gairola 所回答的,您可以使用 Bundle savedInstanceState 保存应用程序的状态。我试图给出一个非常简单的例子,像我这样的新手可以很容易地理解。

假设您有一个带有 TextView 和 Button 的简单片段。每次单击按钮时,文本都会发生变化。现在,更改设备/模拟器的方向,注意丢失了数据(意味着在单击获得数据后更改了数据) ,并且片段再次以第一次开始。通过使用 Bundle SavedInstanceState,我们可以摆脱这个问题。如果查看一下片段.片段生命周期的生命周期,就会得到一个方法“ onSaveInstanceState”在片段即将被销毁时被调用。

因此,我们可以将状态表示的更改后的文本值保存到这个包中,如下所示

 int counter  = 0;
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("value",counter);
}

在您进行定向之后,“ onCreate”方法将被调用,对吗? 所以我们可以这样做

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


if(savedInstanceState == null){
//it is the first time the fragment is being called
counter = 0;
}else{
//not the first time so we will check SavedInstanceState bundle
counter = savedInstanceState.getInt("value",0); //here zero is the default value
}
}

现在,你不会在方向之后丢失你的值。修改后的值总是会显示出来。