什么是onCreate(捆绑的saveInstanceState)


Answers:


106

如果您将应用程序的状态保存在捆绑包中(通常onSaveInstanceState为,onCreate则为非持久性动态数据),则可以将其回传到是否需要重新创建活动(例如,方向更改)的情况下,这样您就不会丢失之前的状态信息。如果未提供任何数据,savedInstanceState则为null。

...您应该使用onPause()方法将任何持久性数据(例如用户编辑)写入存储。另外,在将活动置于这样的背景状态之前,将调用onSaveInstanceState(Bundle)方法,从而使您可以将活动中的任何动态实例状态保存到给定的Bundle中,如果活动被以后在onCreate(Bundle)中接收需要重新创建。有关流程的生命周期如何与其托管的活动联系在一起的更多信息,请参见流程生命周期部分。请注意,将持久性数据保存在onPause()中而不是onSaveInstanceState(Bundle)中非常重要,因为后者不是生命周期回调的一部分,因此不会在文档中描述的每种情况下都调用它。

资源


2
其他活动共享同一个Bundle吗?如果我启动另一个活动,它是否从第一个活动通过了Bundle?
Francisco Corrales Morales 2015年

17

onCreate(Bundle savedInstanceState)Bundle首次启动活动获取时,您将获得null;当活动方向更改时,它将被使用.......

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

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

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


11
savedInstanceStatenull如果onSavedInstanceState()以前曾调用过,则将为非。方向变化只是其中一种可能的例子。
亚历克斯·洛克伍德

1
@AlexLockwood,我正在尝试考虑所有可能发生这种情况的情况。有文件吗?我能想到的一个例子是用户是否切换应用程序并返回,但是该活动已被破坏以恢复资源。在这种情况下,如果重写onSaveInsanceState(),android将使用捆绑包重新创建活动,对吗?
batbrat 2014年

1
@batbrat是的...我发表的评论(差不多两年前)并不完全正确。我猜最好的表达方式是,当且仅当以前调用过它的方法时,它的Bundle参数onCreate(Bundle)才会为非。这会在方向更改期间发生...,并且在活动被操作系统终止后又恢复活动,以及在设备上触发您感兴趣的任何其他配置更改时也会发生。nullActivityonSaveInstanceState
亚历克斯·洛克伍德2014年

感谢Alex的澄清。对此主题有一些澄清是很好的。我忘记了除定向开关以外的其他配置更改。
batbrat 2014年

15

正如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
    }
}

现在,入职培训将不会失去您的价值。修改后的值将始终显示。


请注意,这在Activity上也适用。您能否进一步解释(活动捆绑)和片段捆绑的区别?
laalaguer '17

您可以从活动和片段的生命周期中清楚地了解一个活动可以一次显示多个片段,因此,基本区别是您可能想为活动的所有片段保存一些值,然后您将使用活动包,否则,如果是针对特定片段,则应使用片段包。
Asad

5

Android中的onCreate(Bundle savedInstanceState)函数:

1)首次调用或启动Activity时,onCreate(Bundle savedInstanceState)方法负责创建该活动。

2)当活动的方向(即从水平到垂直或从垂直到水平)改变时,或者当活动被任何操作系统强行终止时,那么saveInstanceState即Bundle类的对象将保存活动的状态。

3)更改方向后,onCreate(Bundle savedInstanceState)将调用并重新创建活动,并从saveInstanceState加载所有数据。

4)当应用程序中发生上述情况时,基本Bundle类用于存储活动数据。

5)应用程式不需要onCreate()。但是在应用程序中使用它的原因是因为该方法是放置初始化代码的最佳位置。

6)您也可以将初始化代码放在onStart()或onResume()中,当您的应用程序首次加载时,其工作方式与onCreate()中的相同。


4

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


0

如果您的Activity并在上述场景(可视视图)中终止,则将调用onCreate(Bundle savedInstanceState),并且saveInstanceState将为非null。然后,您的应用程序可以从saveInstanceState抓取(捕获)数据并重新生成您的Activity

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.