什么是 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方法介绍