【起航计划 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 ...
随机推荐
- IdentityServer4 学习笔记[2]-用户名密码验证
回顾 上一篇介绍了IdentityServer4客户端授权的方式,今天来看看IdentityServer4的基于密码验证的方式,与客户端验证相比,主要是配置文件调整一下,让我们来看一下 配置修改 pu ...
- kuangbin专题十六 KMP&&扩展KMP HDU3746 Cyclic Nacklace
CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, ...
- POJ1049 Microprocessor Simulation
题目来源:http://poj.org/problem?id=1049 题目大意: 一种小型的微处理器有以下特性: 1. 每个字长4bit. 2. 地址用2个字进行编码.先高位字后低位字,即高位字大的 ...
- Install AntContrib
link: http://www.neiland.net/blog/article/how-to-install-ant-contrib/ Step 1: Get ANT-Contrib And In ...
- P5123 [USACO18DEC]Cowpatibility(容斥)
Luogu5123 计算[两组数中有相同的]=\(\sum_{i}\)两组数中\(i\)个数相同的组合方案 map <string,int> 操作\(:\)加上\(,\)防止算重 #inc ...
- dataTable调用接口渲染数据,没有数据,报错
当没有数据的时候,报错: 解决方法: 在后台那边处理一下,当没有数据的时候,令 data : ' ' 或者 data : [ ] 前端代码: var loading = layer.load(1, { ...
- webAPI过滤器添加参数签名
项目需求: 接口对安卓和IOS开发接口,需要房子用户窜改数据请求接口.添加sign签名校验参数. 代码如下:加上特性标签就可以控制部分接口验证 public class SignAuthorizeFi ...
- Java升级替换java version "1.5.0"
首先进行java安装 http://www.cnblogs.com/someone9/p/8670585.html 2. 然后查看版本信息,仍然是1.5.0 [root@OKC java]# java ...
- my.兽决_等_价格
1.20170411 音乐洒水车,升50级 送了 兽决 隐身,摆摊推荐价格 20000金,大家都卖26000金 2.20170417 音乐洒水车 挖到 必杀 魔决,推荐价格 19820金,我以 -10 ...
- 标签li设为display inline-block后间距问题
在对导航栏做水平排列的时候,我们往往对li元素设为display:inline-block 目的是为了,让所有li元素并排在一起,但是遇到个问题,我们的标签之间会产生空白边距 如图所示: 这样看上去, ...