【起航计划 012】2015 起航计划 Android APIDemo的魔鬼步伐 11 App->Activity->Save & Restore State onSaveInstanceState onRestoreInstanceState
Save & Restore State与之前的例子Android ApiDemo示例解析(9):App->Activity->Persistent State 实现的UI类似,但功能和实现方法稍有不同。
(9)是通过Shared Preferences 和 Activity 的onPause() ,和onResume()来保持UI中 EditText 的值。
本例是通过onSaveInstanceState(Bundle savedBundle) 来实现保持UI状态。 和onPause,onResume不同的是,onSaveInstanceState不是Activity Life cycle的一部分,也不一定会在Activity 被destroyed前执行,比如说用户按“Back”按键回退到前一个Activity时,当前的Activity并不会调用 onSaveInstanceState方法,因为这时是用户指明想关闭当前Activity,而onPause一定会执行,因为onPause 是Activity生命周期的一个状态。如果onSaveInstanceState被调用的话,它一定会在onStop之前调用,有时会在 onPause之前调用。
onSaveInstanceState设计在当Activity destroy之前调用(如当Android切换到其它应用,此时Android根据系统资源的分配情况,用可能会将在后台运行的Activity清除, 或是系统配置改变,比如屏幕从纵向放平,当前的Activity会先被Destory,然后根据当前配置重新创建当前Activity的实例。
此时Activity的onSaveInstanceState会在Activity Destroy之前调用,此时应在onSaveInstanceState将一些UI状态临时存储中Bundle中。然后Android系统会重新执行 Activity的onCreate方法,传入参数为Bundle对象。如果在onSaveInstanceState设置了,这个Bundle对象即是 之前保存的Bundle对象,应用可以在onCreate 或是onRestoreInstanceState(Bundle savedInstanceState) 恢复UI状态,这样可以做到在应用或是Activity重启时能保持上此退出时的状态。
但是看看SaveRestoreState.java中似乎没有任何与Save /Restore State 相关的代码,方法getSavedText和setSavedText和本例无关。
这是因为Activity的缺省onSaveInstanceState实现完成了对UI状态的Save和Restore。例子中上面的 EditText输入在Activity重启时会恢复,而下面的EditText输入不会被保存和恢复。Activity的缺省 onSaveInstanceState实现只会对定义了ID(android:id)的View实现Save 和Restore.来看看R.layout.save_restore_state中的定义:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<LinearLayout android:orientation="vertical" android:padding="4dip"
android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/msg"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="0" android:textAppearance="?android:attr/textAppearanceMedium"
android:paddingBottom="4dip" /> <TextView
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="0" android:paddingBottom="4dip"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/saves_state"/> <EditText android:id="@+id/saved"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="1" android:background="@drawable/green"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/initial_text"
android:freezesText="true">
</EditText> <TextView
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="0" android:paddingTop="8dip" android:paddingBottom="4dip"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/no_saves_state"/> <EditText
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="1" android:background="@drawable/red"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/initial_text">
</EditText> </LinearLayout>
</ScrollView>
上面的EditText定义了ID而下面的EditText没有定义ID。这可以通过旋转屏幕来测试。旋转屏幕可以保证当前activity先被 Destory然后再Create:在上下EditText输入值,然后旋转屏幕,可以看到只有上面的EditText值被保留。
注:在Emulator上,可以先按下“NumLock”,然后按7,9来旋转屏幕。

有些情况下需要重载onRestoreInstanceState,此时别忘了调用super.onRestoreInstanceState。
【起航计划 012】2015 起航计划 Android APIDemo的魔鬼步伐 11 App->Activity->Save & Restore State onSaveInstanceState onRestoreInstanceState的更多相关文章
- 【起航计划 007】2015 起航计划 Android APIDemo的魔鬼步伐 06 App->Activity->Forwarding Activity启动另外一个Activity finish()方法
Android应用可以包含多个Activity,某个Activity可以启动另外的Activity. 这些Activity采用栈结构来管理,新打开的Activity叠放在当前的Activity之上,当 ...
- 【起航计划 004】2015 起航计划 Android APIDemo的魔鬼步伐 03 App->Activity->Animation Activity跳转动画 R.anim.×× overridePendingTransition ActivityOptions类
App->Activity->Animation示例用于演示不同Activity切换时动态效果. android 5.0例子中定义了6种动画效果: 渐变Fade In 缩放Zoom In ...
- 【起航计划 002】2015 起航计划 Android APIDemo的魔鬼步伐 01
本文链接:[起航计划 002]2015 起航计划 Android APIDemo的魔鬼步伐 01 参考链接:http://blog.csdn.net/column/details/mapdigitap ...
- 【起航计划 037】2015 起航计划 Android APIDemo的魔鬼步伐 36 App->Service->Remote Service Binding AIDL实现不同进程间调用服务接口 kill 进程
本例和下个例子Remote Service Controller 涉及到的文件有RemoteService.java ,IRemoteService.aidl, IRemoteServiceCallb ...
- 【起航计划 031】2015 起航计划 Android APIDemo的魔鬼步伐 30 App->Preferences->Advanced preferences 自定义preference OnPreferenceChangeListener
前篇文章Android ApiDemo示例解析(31):App->Preferences->Launching preferences 中用到了Advanced preferences 中 ...
- 【起航计划 027】2015 起航计划 Android APIDemo的魔鬼步伐 26 App->Preferences->Preferences from XML 偏好设置界面
我们在前面的例子Android ApiDemo示例解析(9):App->Activity->Persistent State 介绍了可以使用Shared Preferences来存储一些状 ...
- 【起航计划 020】2015 起航计划 Android APIDemo的魔鬼步伐 19 App->Dialog Dialog样式
这个例子的主Activity定义在AlertDialogSamples.java 主要用来介绍类AlertDialog的用法,AlertDialog提供的功能是多样的: 显示消息给用户,并可提供一到三 ...
- 【起航计划 003】2015 起航计划 Android APIDemo的魔鬼步伐 02 SimpleAdapter,ListActivity,PackageManager参考
01 API Demos ApiDemos 详细介绍了Android平台主要的 API,android 5.0主要包括下图几个大类,涵盖了数百api示例:
- 【起航计划 022】2015 起航计划 Android APIDemo的魔鬼步伐 21 App->Launcher Shortcuts 为某个非主Activity在Home Screen上建立一个快捷方式
Android 操作系统对于<intent-filter>含有下列属性的Activity会在应用程序管理器(Launcher)显示一项,一般这个Activity对应于某个应用的主Activ ...
随机推荐
- Educational Codeforces Round 59 (Rated for Div. 2)
熬夜爆肝,智商急剧下降 坐标UTC+8晚上23:35开始 晚上脑袋转的慢,非常慢 T1上来先做还花了好几分钟 T2本来是有式子的我TM写数位DP写炸了然后才发现是有公式 T3英语不好,一开始题意没读懂 ...
- 洛谷4316 绿豆蛙的归宿(DAG递推/概率dp)
题目大意: 给定一个DAG,求起点到终点的路径长度期望 根据题意可以知道每一条边都有一定概率被走到 那么\(\displaystyle\begin{aligned} Ans = \sum_{e \in ...
- oracle ,mysql,postgres jdbc配置文件
#db mysql #jdbc.driver=com.mysql.jdbc.Driver #jdbc.url=jdbc:mysql://localhost:3306/mysql?&useUni ...
- springcloud系列10 整合Hystrix遇到的坑:
首先配置类: @Bean public ServletRegistrationBean getServlet(){ HystrixMetricsStreamServlet streamServlet ...
- 解决spring使用动态代理
解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ... 转 ...
- freemarker ! 用法
${(user.name)!""} 请注意,是打了()的 也就是它会先判断user是不是为null 在判断user.name 是不是为null
- Python的安装位置与Python库
如何查看Python的安装位置: 输入 where python ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- ORA-14517: Subpartition of index "string.string" is in unusable state
今天碰到个ORA-03113, 原因不明. 猜测因为某些table DDL操作过后导致index unuable的case, 然后进行analyze table, 再碰到ORA-14517. 最后通 ...
- python 面向对象及封装继承和多态
######装饰器######装饰器的概念 - 装饰器的实现是函数里面嵌套函数;- 装饰器的本质是一个函数, 它可以让其他函数在不需要做任何代码改动的前提下增加额外的功能;- 装饰器需要传递一个函数, ...
- Python 基础学习之if语句
cars=['audi','xiali','bwm','benz',] ##根据要求bmw全部为大写,其他的首字母为大写 for car in cars: if car=='bmw': print(c ...