Android activity的变量保存

一、当一个在Activity aA启动另一个Activity aB的时候两个Activity的回调函数的调用顺序:

    1、aA的onPause()被调用;
    2、aB的onCreate(),onStart(),onResume()调用依次被调用,此时aB获取了用户焦点;
    3、这时如果aA如果在屏幕上不可见(aB的界面并不是全屏幕的),那aA的onStop()被调用。

    由以上可以引申:如果在aA中修改的数据需要在aB中使用,这时就需要在onPause()中对修改的数据进行保存到数据库中(或其他可被两Activity共享的空间),而不能在onStop()中进行。
二、临时变量的保存:
    因为当onPause()和onStop()被调用后,有可能因内存不足而可被系统销毁,所以要对一些数据进行保存,以防止Activity被系统kill掉而丢失:
    一些需要保存到数据库数据执行保存,这些数据可以在onCreate()方法中重新从数据库中加载;
    一些不能保存到数据库中的数据(数据库中并没有为此部份数据设置相应字段,如仅用于标识当前Activity的状态信息的数据)通过onSaveInstanceState(Bundle)来保存到Bundle中,随后系统再次进行回退到此Activity的时候,系统会在onCreate(Bundle)中从Bundle中获取到之前保存的数据,或者通过onRestoreInstanceState(Bundle)(在onStart()方法后被调用)方法来获取并设置保存的数据;
    对一些不能用Bundle记录的数据,可以在Object onRetainNonConfigurationInstance()中进行保存,并通过getLastNonConfigurationInstance()方法获取之前函数返回的Object,并根据此Object进行设置(这步还原的操作可在onCreate()和onStart()方法中执行)。
三、onSavdInstanceState(Bundle)与onPause()的调用时机的区别:
    1、当因要启动另一个Activity,当前Activity要失去焦点时,前者先被调用然后是后者;
    2、当点击BACK键或调用finish()结束当前Activity时,前者是不会被调用的(调用顺序:onPause()->onStop()->onDestory())。
四、Activity的一些配置(如屏幕方向)改变了的时候,系统默认是重新启动这个Activity,也可以自己处理某些配置改变事件:
    <activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">
    像上面android:configChanges的配置,当这些配置改变后,系统是不会重新启动Activity的,这是系统会去调用onConfigurationChanged()方法。
    我们就可以自己实现此方法来根据作出相应处理,如下:
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();//当然实际的处理应该不是这样
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
    // Checks whether a hardware keyboard is available
    if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
        Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
    } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
        Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
    }
}

posted @ 2011-04-25 09:59  奋奋  阅读(6365)  评论(0编辑  收藏  举报