Recreating an Activity

有几个场景中你的activity会销毁是由于正常的app行为,例如当用户按下后退按钮或通过调用finish()方法销毁自身。系统也会销毁你的activity如果是目前停止并长时间没有被使用或前台activity需要更多的资源,所以系统必须关闭后台进程去回收内存。

当你的activity是因为用户按下返回键而被摧毁时,activity实例在系统中是被永久销毁了,因为该行为表示activity不再是被需要的了。然而,如果系统销毁activity时由于系统约束(而不是正常程序行为),虽然实际的activity实例被销毁,但系统记得它存在,如果用户返回它,系统创建一个新的activity实例使用一组销毁时被保存的数据,系统使用以前的数据恢复以前的状态称为“实例状态”,是一组键值对存储在Bundle对象里。

注意:当用户旋转屏幕时,你的activity将会被销毁,当屏幕改变方向时,系统会破坏并重新创建前台的activity,因为在屏幕的配置已经改变,你的activity可能需要加载替代资源(如布局)。

默认情况下,系统使用Bundle实例去保存你activity布局文件里每个View对象的信息(如文本值进入EditText对象)。所以,如果你的活动实例被销毁并重新创建,布局状态会被自动修复到原来的样子。然而,你的activity可能有更多你想恢复的状态信息,如成员变量跟踪用户的活动的进展。

注:为了使Android系统恢复在您的活动的意见的状态,每个视图必须具有唯一的ID,通过android:id属性声明。

为了节省额外活动状态的数据,您必须覆盖onSaveInstanceState()回调方法,系统调用该方法是在用户离开你的activity并通过它的Bundle对象保存意料之外被销毁的事件。如果系统之后必须重新创建活动实例,它将同一个Bundle对象传递给onRestoreInstanceState()和onCreate()方法。

图解:随着系统开始停止你的activity,它调用onSaveInstanceState()(1),您可以指定额外的状态数据并把它们保存起来,以防活动实例必须被重新创建。如果activity被摧毁,必须重新创建相同的实例,该系统通过调用onCreate()方法(1),(2)和onRestoreInstanceState()方法(3)并传入之前保存的对象来实现。

保存你Activity的状态



当你的activity 开始要停止时,系统调用onSaveInstanceState()方法并把一个状态信息放在一个键值对中。 此方法的默认实现保存信息活动的状态的视图层次,如一个EditText小部件中的文本或滚动列表视图的位置。

为你保存你activity的额外信息,你必须实现onSaveInstanceState()方法并添加键值对到Bundle对象中。例如:

static final String STATE_SCORE = "playerScore";

static final String STATE_LEVEL = "playerLevel";

...

@Override

public void onSaveInstanceState(Bundle savedInstanceState) {

// Save the user‘s current game state

savedInstanceState.putInt(STATE_SCORE, mCurrentScore);

savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

// Always call the superclass so it can save the view hierarchy state

super.onSaveInstanceState(savedInstanceState);

}

恢复Activity状态


当你的activity是先前被销毁现在又重建的时候,你可以从Bundle对象中恢复你保存的状态。onCreate()和onRestoreInstanceState()回调方法得到相同的Bundle实例。

因为onCreate()方法被系统调用有两种情况,一种是创建一个新的activity实例,还有一种是恢复之前activity的实例,所以你必须在阅读之前检查Bundle对象是否为null,如果为null,系统是正在创建一个新的activity实例,否则就是重建一个之前被销毁的activity。

例如,你可以在onCreate()方法中恢复一些状态数据:

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); // Always call the superclass first

// Check whether we‘re recreating a previously destroyed instance

if (savedInstanceState != null) {

// Restore value of members from saved state

mCurrentScore = savedInstanceState.getInt(STATE_SCORE);

mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

} else {

// Probably initialize members with default values for a new instance

}

...

}

你可以选择实现onRestoreInstanceState()方法代替onCreate()方法去恢复状态。系统会在onStart()方法后调用它,系统只有在有保存的信息需要去恢复时才会调用onRestoreInstanceState()方法,所以你不需要检查Bundle是否为null

public void onRestoreInstanceState(Bundle savedInstanceState) {

// Always call the superclass so it can restore the view hierarchy

super.onRestoreInstanceState(savedInstanceState);

// Restore state members from saved instance

mCurrentScore = savedInstanceState.getInt(STATE_SCORE);

mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

}

注意:始终调用父类的onRestoreInstanceState()方法,这样的默认实现可以恢复视图层次的状态。

时间: 2024-09-27 01:27:28

Recreating an Activity的相关文章

Recreating an Activity 重新创建一个活动

There are a few scenarios in which your activity is destroyed due to normal app behavior, such as when the user presses theBack button or your activity signals its own destruction by calling finish(). The system may also destroy your activity if it's

Android学习路线(十五)Activity生命周期——重新创建(Recreating)一个Activity

先占个位置,下次翻译~ :p There are a few scenarios in which your activity is destroyed due to normal app behavior, such as when the user presses the Back button or your activity signals its own destruction by calling finish(). The system may also destroy your

Android学习路线(十二)Activity生命周期——启动一个Activity

先占个位置,过会儿来翻译,:p Unlike other programming paradigms in which apps are launched with a main()method, the Android system initiates code in an Activity instance by invoking specific callback methods that correspond to specific stages of its lifecycle. Th

Android学习路线(十一)管理Activity的生命周期

当一个用户进入,退出,再次进入你的应用时,你的应用中的Activity 会在它的生命周期的各个状态下切换.例如,当你的activity第一次启动,它出现在系统的前方接受用户的焦点.在这个过程中,Android系统调用了一系列的生命周期方法来设置UI和其他组件.如果用户执行了一个操作,启动了另一个activity或者切换到其它应用中,你的activity会移动到后台(这时activity已经不可见,但是它的实力和状态都保持不变),系统会调用另外的一些生命周期方法. 通过这些生命周期方法,你可以声明

Managing the Activity Lifecycle 管理活动的生命周期

Managing the Activity Lifecycle 管理活动的生命周期 Previous         Next         Get started Dependencies and prerequisites 依赖和先决条件 How to create an Android project (see Creating an Android Project) 如何创建一个Android项目(参见创建一个Android项目) You should also read 你也应该阅读

Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状态之外, 还需要用户手动保存一些成员变量. Fragment的状态有它自己的实例状态和其中的View状态, 因为其生命周期的灵活性和实际需要的不同, 情况会多一些. 根据源码, 列出了Fragment中实例状态和View状态保存和恢复的几个入口, 便于分析查看. 最后专门讲了WebView状态保存和

(android文档原创翻译)管理Activity的生命周期<一>

(英文原文链接地址) 1.启动你的Activity 不同其它的应用程序通过main()方法来启动,android系统是按照一定的顺序通过调用其生命周期(lifecycle)的回调方法来启动或者结束一个activity.本节简要介绍了Activty的最为重要的生命周期,并且示意了怎样处理一个Activity的生命周期. 理解什么叫做生命周期的callbacks 在Activity的生命周期中,android系统会按顺序调用一系列类似于金字塔形排列的生命周期方法,即activity生命周期的每个阶段

Android官方入门文档[14]停止和重新启动一个Activity活动

Android官方入门文档[14]停止和重新启动一个Activity活动 Stopping and Restarting an Activity停止和重新启动一个Activity活动 This lesson teaches you to1.Stop Your Activity2.Start/Restart Your Activity You should also read?Activities 这节课教你1.停止您的Activity活动2.启动/重新启动您的Activity活动 你也应该阅读?

Android官方入门文档[15]重新创建一个Activity活动

Android官方入门文档[15]重新创建一个Activity活动 Recreating an Activity重新创建一个Activity活动 This lesson teaches you to1.Save Your Activity State2.Restore Your Activity State You should also read?Supporting Different Screens?Handling Runtime Changes?Activities 这节课教你1.保存