【起航计划 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英语不好,一开始题意没读懂 ...
- CF431D Random Task 二分+数位dp
One day, after a difficult lecture a diligent student Sasha saw a graffitied desk in the classroom. ...
- Java基础笔记(十七)——继承(续)final
final 最终的 修饰类,此类不能被继承.final与访问修饰符public位置随意,在class前即可.public final class A{ } 修饰方法,此方法不能被子类重写,但可以被子 ...
- CF628D Magic Numbers (数据大+数位dp)求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数
题意:求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数(这里的偶数位是的是从高位往低位数的偶数位).a,b<10^2000,m≤2000,0≤d≤9 a,b< ...
- xshell连接不上
1.排查道路通不通 ping baidu.com 是否通畅,如果不通 2.排查DNS ping 223.5.5.5 地址解释是否通畅 3.是否有劫财劫色的 检查防火墙 selinux是否 关 ...
- 基于ksoap2-android的soap的封装
实例基于ksoap2-android-assembly-3.3.0-jar-with-dependencies.jar 1:定义回调接口,通过泛型确定返回值类型 package com.ciii.bd ...
- ZPL JS 调用共享打印机
<script type="text/javascript"> function printZpl(zpl) {var printWindow = window.ope ...
- 信息领域热词分析系统--python过滤
利用python过滤去没用的词语,过滤的词语存储在停用文件中. #创建停用词表 def stopwordlist(): stopwords=[line.strip() for line in open ...
- Linux 进程间通信之管道(pipe),(fifo)
无名管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信: 定义函数: int pipe(int f ...
- python 运算符-赋值运算
结果是值 算数运算: a = 10 * 10 赋值运算: a = a + 1 a +=1 结果是布尔值 比较运算: a = 1 > 5 逻辑运算: a = 1 > 6 or 1= ...