onSaveInstanceState和onRestoreInstanceState.

来源:互联网 发布:王天一用软件作弊 编辑:程序博客网 时间:2024/05/17 00:00

1.onSaveInstanceState(Bundle outState)与onRestoreIntanceState(Bundle savedInstanceState)什么情况下调用?

 系统只会在Activity即将被销毁并且有机会重新显示的情况下才会去调用它,比如说,旋转屏幕,Activity异常销毁同时会立刻创建新的Activity实例。 这个与用户交互Activity正常销毁不同.所以可以简单的理解为Activity只会在异常终止的时候才会调用onSaveInstanceState和  onRestoreIntanceState来恢复和存储数据。其他情况不会触发这个过程.

异常情况下:

 Activity终止,系统会调用onSaveInstanceState来保存当前Activity的状态,这个方法调用时机是在 ,当Activity被重新创建后,系统会调用onRestoreIntanceState,并且把之前Activity销毁时 调用的onSaveInstanceState()方法所保存的bundle作为参数同时传递给onRestoreIntanceState 和onCreate,但二者是有区别的.

俩者区别:

1)  onRestoreIntanceState一旦被调用,其参数Bundle savedInstanceState是一定有值的,所以不需要额外的判断是否为空。2)  onCreate()不行,onCreate如果是正常启动,其参数Bundle savedInstanceState为null,所以必须进行额外的判断。官方建议采用onRestoreInstanceState()去恢复数据.

以下代码帮助理解:横竖屏切换下

public class MainActivity extends Activity {     private final static String TAG = "MainActivity";     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        if (savedInstanceState != null) {            String test = savedInstanceState.getString("HelloWorld");            Log.d(TAG, "[onCreate] restore HelloWorld:" + test);        }        //用代码写死横竖屏        //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);    }    @Override    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        Log.d(TAG, "onSaveInstanceState");        outState.putString("HelloWorld", "test");    }    @Override    protected void onRestoreInstanceState(Bundle savedInstanceState) {        super.onRestoreInstanceState(savedInstanceState);        String test = savedInstanceState.getString("HelloWorld");        Log.d(TAG, "[onRestore] restore HelloWorld:" + test);    }    @Override    protected void onStart() {        super.onStart();        Log.d(TAG, "onStart");    }    @Override    protected void onResume() {        super.onResume();        Log.d(TAG, "onResume");    }    @Override    protected void onPause() {        super.onPause();        Log.d(TAG, "onPause");    }    @Override    protected void onStop() {        super.onStop();        Log.d(TAG, "onStop");    }    @Override    protected void onDestroy() {        super.onDestroy();        Log.d(TAG, "onDestroy");    }

输出结果:
这里写图片描述

a.刚启动(Activity) :   create-> start-> resumeb.旋转屏幕后,旧的activity先puase -->stop-->destory,而onSaveInstanceState就是在onStop之前调用.c. 新的Activity的在oncreate方法中,if (savedInstanceState != null) 为true,从而打印log.从而说明旧activity在销毁前进行了数据的存储.d.新的activity:create -> start -> onRestoreInstanceState -> onresume
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鼻炎的人感冒了怎么办 小孩上幼儿园反复感冒怎么办 3岁宝宝感冒鼻炎怎么办 鼻炎犯了鼻子不通气怎么办 食物呛到鼻子里怎么办 胃疼引起的焦虑怎么办 泰迪犬发生口腔亏痒怎么办? 俩鼻子都堵了怎么办 2岁宝宝鼻甲肿大怎么办 感冒10多天不好怎么办 宝妈鼻炎犯了怎么办 鼻炎犯了好多黄鼻涕怎么办 空调吹多了上火怎么办 宝宝感冒鼻塞流鼻涕口臭怎么办 怀孕了有鼻息肉怎么办 孕晚期鼻炎犯了怎么办 孕妇鼻炎犯了头疼怎么办 一岁宝宝有鼻炎怎么办 蒸馒头的面酸了怎么办 dnf点券充错账号了怎么办 英雄联盟点券充错区了怎么办 文玩鼻烟壶盖子松了怎么办 文胸磨腋下的肉怎么办 荷兰在窝里拉屎怎么办 宝宝把泡沫吃了怎么办 荷兰猪一直叫该怎么办 人吃了缓冲泡沫怎么办 不小心吃了泡沫怎么办 不想养荷兰猪了怎么办 刚买的乌龟死了怎么办 剪猫指甲出血了怎么办 猫吃了酸性植物怎么办 金鱼在缸底不动怎么办 野兔子不吃不喝怎么办 让荷兰猪咬了怎么办 仓鼠的脚被棉花怎么办 仓鼠的脚变黑了怎么办 夏天小仓鼠生了怎么办 把仓鼠摔出血了怎么办 仓鼠摔成骨折了怎么办 孩子被仓鼠咬了怎么办