什么是 onCreate(Bundle savedInstanceState)

Posted

技术标签:

【中文标题】什么是 onCreate(Bundle savedInstanceState)【英文标题】:What's onCreate(Bundle savedInstanceState) 【发布时间】:2012-06-04 08:12:20 【问题描述】:

谁能帮我了解onCreate(Bundle savedInstanceState) 中的Bundle savedInstanceState 我是android 新手。我尝试从 developer.android.com 了解它。但我无法理解。谁能简化一下?

【问题讨论】:

这是个好视频:youtube.com/watch?v=kkYIMZw9gzQ 作为第一手参考,我将把它留在这里:developer.android.com/guide/components/activities/… 【参考方案1】:

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

...你 应该使用 onPause() 方法来写入任何持久性数据(例如 用户编辑)存储。此外,该方法 在将活动放入之前调用 onSaveInstanceState(Bundle) 这样的背景状态,让您可以保存任何动态 将您的活动中的实例状态放入给定的 Bundle 中,稍后再进行 如果需要重新创建活动,则在 onCreate(Bundle) 中收到。 有关如何 流程的生命周期与它所托管的活动相关联。笔记 将持久数据保存在 onPause() 而不是 onSaveInstanceState(Bundle) 因为后者不是 生命周期回调,因此不会在每种情况下都被调用为 在其文档中描述。

source

【讨论】:

其他活动是否共享同一个 Bundle ?如果我开始另一个活动,它是否从第一个活动传递 Bundle ?【参考方案2】:

onCreate(Bundle savedInstanceState) Activity 首次启动时您将得到 Bundle null 并且当 Activity 方向发生更改时它将被使用.......

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

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

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

【讨论】:

如果之前调用了onSavedInstanceState()savedInstanceState 将不是null。方向变化只是可能发生这种情况的一个例子。 @AlexLockwood,我正在尝试考虑可能发生这种情况的所有情况。有文件吗?我能想到的一个例子是,如果用户切换应用程序并返回,但活动已被破坏以恢复资源。在这种情况下,如果 onSaveInsanceState() 被覆盖,android 将使用 bundle 重新创建活动,对吧? @batbrat 是的......我(大约两年前)发表的评论并不完全正确。我想最好的表达方式是onCreate(Bundle)Bundle 参数将不是null,当且仅当Activity 之前调用了onSaveInstanceState 方法。这会在方向更改期间发生......并且还会在 Activity 被操作系统杀死后返回时发生,以及当您在设备上触发任何其他感兴趣的配置更改时。 感谢亚历克斯的澄清。对这个主题有一些清晰的了解是很好的。除了方向开关之外,我忘记了配置更改。【参考方案3】:

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

假设,您有一个带有 TextView 和 Button 的简单片段。每次单击按钮时,文本都会更改。现在,更改您的设备/模拟器的方向,并注意您丢失了数据(意味着单击您获得的更改后的数据)并且片段再次作为第一次开始。通过使用 Bundle savedInstanceState 我们可以摆脱这个。如果你看一下片段的生命周期。Fragment Lifecylce你会发现片段即将被销毁时调用了一个方法“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。你能详细解释一下(Bundle of Activity)和Bundle of Fragment的区别吗? 你可以从activity和fragment的生命周期中得到一个清晰的认识,一个activity可以一次显示多个fragment。所以,基本的区别是你可能想为所有的一个活动的片段,那么你将使用活动包,否则你应该使用片段包,如果它是针对特定片段的。【参考方案4】:

Android中的onCreate(Bundle savedInstanceState)函数:

    当一个Activity第一次调用或启动时,onCreate(Bundle savedInstanceState)方法负责创建Activity。

    当 Activity 的方向(即从水平到垂直或垂直到水平)发生变化或 Activity 被任何操作系统强制终止时,savedInstanceState 即 Bundle 类的对象将保存 Activity 的状态。

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

    基本上,Bundle 类用于在应用中发生上述情况时存储活动的数据。

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

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

【讨论】:

【参考方案5】:

onCreate(Bundle) 在 Activity 首次启动时被调用。您可以使用它来执行一次性初始化,例如创建用户界面。 onCreate() 采用一个参数,该参数要么为空,要么为 onSaveInstanceState 先前保存的一些状态信息。

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于什么是 onCreate(Bundle savedInstanceState)的主要内容,如果未能解决你的问题,请参考以下文章

(转) 为什么启动Activity都是写的super.onCreate

02_SQliteOpenHelper介绍&oncreate方法介绍

Android——onCreate( )方法详解(转)

Activity的onCreate()的PersistableBundle 参数坑。

在 Android 运行时更新视图

在活动的 onCreate 之前调用 Fragment 的 onCreateView