码迷,mamicode.com
首页 > 其他好文 > 详细

Recreating an Activity

时间:2015-01-12 06:43:09      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

有几个场景中你的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()方法,这样的默认实现可以恢复视图层次的状态。

 

Recreating an Activity

标签:

原文地址:http://www.cnblogs.com/ztSpace/p/4217591.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!