博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android学习笔记——onSaveInstanceState的使用
阅读量:5732 次
发布时间:2019-06-18

本文共 2893 字,大约阅读时间需要 9 分钟。

hot3.png

//保存当前所有的棋子的位置,在返回应用的时候,重新显示	@Override	protected Parcelable onSaveInstanceState()	{		Bundle bundle=new Bundle();		bundle.putParcelable(INSTANCE, super.onSaveInstanceState());		bundle.putBoolean(INSTANCE_GAME_OVER, isGameOver);		bundle.putParcelableArrayList(INSTANCE_WHITE_ARRAY, mWhiteArray);		bundle.putParcelableArrayList(INSTANCE_BLACK_ARRAY, mBlackArray);			return bundle;	}        //当该activity没有销毁,重新获得焦点的时候载入保存的数据!	@Override	protected void onRestoreInstanceState(Parcelable state)	{		if(state instanceof Bundle){  //判断state是否为bundle类型			Bundle bundle=(Bundle) state;			isGameOver=bundle.getBoolean(INSTANCE_GAME_OVER);			mWhiteArray=bundle.getParcelableArrayList(INSTANCE_WHITE_ARRAY);			mBlackArray=bundle.getParcelableArrayList(INSTANCE_BLACK_ARRAY);			super.onRestoreInstanceState(bundle.getParcelable(INSTANCE));			return ;		}		// TODO Auto-generated method stub		super.onRestoreInstanceState(state);	}

要保存当前的程序运行的数据时,要使用一个Bundle 来保存数据;其是一个使用类似键值对的形式保存;

. onSaveInstanceState和onRestoreInstanceState基本作用

    onSaveInstanceState是用来保存UI状态的,你可以使用它保存你所想保存的东西,在Activity杀死之前,它一般在onStop或者onPause之前触发,onRestoreInstanceState则是在onResume之前触发回复状态,至于复写这个方法后onCreate方法是否会被调用。

关于onSaveInstanceState (),是在函数里面保存一些View有用的数据到一个Parcelable对象并返回。在Activity的onSaveInstanceState(Bundle outState)中调用View的onSaveInstanceState (),返回Parcelable对象,

  接着用Bundle的putParcelable方法保存在Bundle  savedInstanceState中。

  当系统调用Activity的的onRestoreInstanceState(Bundle savedInstanceState)时, 同过Bundle的getParcelable方法得到Parcelable对象,然后把该Parcelable对象传给View的onRestoreInstanceState (Parcelable state)。在的View的onRestoreInstanceState中从Parcelable读取保存的数据以便View使用。

  这就是onSaveInstanceState() 和 onRestoreInstanceState() 两个函数的基本作用和用法

二  其onSaveInstanceState方法会在什么时候被执行,有这么几种情况:

1、当用户按下HOME键时

      这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则

2、长按HOME键,选择运行其他的程序时。

3、按下电源按键(关闭屏幕显示)时。

4、从activity A中启动一个新的activity时。

5、屏幕方向切换时,例如从竖屏切换到横屏时

三. onSaveInstanceState()方法的默认实现

  如果我们没有覆写onSaveInstanceState()方法, 此方法的默认实现会自动保存activity中的某些状态数据, 比如activity中各种UI控件的状态.。android应用框架中定义的几乎所有UI控件都恰当的实现了onSaveInstanceState()方法,因此当activity被摧毁和重建时, 这些UI控件会自动保存和恢复状态数据. 比如EditText控件会自动保存和恢复输入的数据,而CheckBox控件会自动保存和恢复选中状态.开发者只需要为这些控件指定一个唯一的ID(通过设置android:id属性即可), 剩余的事情就可以自动完成了.如果没有为控件指定ID, 则这个控件就不会进行自动的数据保存和恢复操作。

 

  由上所述, 如果我们需要覆写onSaveInstanceState()方法, 一般会在第一行代码中调用该方法的默认实现:super.onSaveInstanceState(outState)。

四. 是否需要重写onSaveInstanceState()方法

   既然该方法的默认实现可以自动的保存UI控件的状态数据, 那什么时候需要覆写该方法呢? 

 

  如果需要保存额外的数据时, 就需要覆写onSaveInstanceState()方法。大家需要注意的是:onSaveInstanceState()方法只适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等,而不应该用来保存持久化数据,持久化数据应该当用户离开当前的activity时,在onPause()中保存(比如将数据保存到数据库或文件中)。说到这里,还要说一点的就是在onPause()中不适合用来保存比较费时的数据,所以这点要理解。

 

  由于onSaveInstanceState()方法方法不一定会被调用, 因此不适合在该方法中保存持久化数据, 例如向数据库中插入记录等. 保存持久化数据的操作应该放在onPause()中。若是永久性值,则在onPause()中保存;若大量,则另开线程吧,别阻塞UI线程。

本文 

转载于:https://my.oschina.net/zehui1314/blog/669103

你可能感兴趣的文章
数据分析软件Power BI探索数据教程(六)——如何获取更多仪表盘空间
查看>>
BlazingSQL运用GPU创造比Apache Spark高20倍运算效率
查看>>
好程序员web前端分享12个CSS高级技巧汇总
查看>>
BAT、IBM、亚马逊、微软等一线互联网的区块链版图布局
查看>>
智能合约:开启一个新经济时代
查看>>
[翻译] JavaScript函数的6个基本术语
查看>>
vue静态资源打包中的坑与解决方案
查看>>
Lc 895. Maximum Frequency Stack 最大频率栈 JS
查看>>
j2ee分布式架构 dubbo + springmvc + mybatis + ehcache + redis 技术介绍
查看>>
自定义可拖拽LinearLayout(ViewGroup),防页面刷新回到原点
查看>>
爬虫基础
查看>>
windows使用git时出现:warning: LF will be replaced by CRLF
查看>>
前端面试题:你知道websocket吗?
查看>>
SpringBoot 整合Shiro 之 自定义Filter
查看>>
NBA之适配器模式
查看>>
废墟搜救机器人入选中国地震局10大最具实效科技成果
查看>>
Concurrency Patterns in Go
查看>>
Node.js+websocket+mongodb实现即时聊天室
查看>>
setTimeout(fn,0)的秘密
查看>>
宽高比是2:1的P 宽度变化是高度跟随变化
查看>>