Android菜鸟的成长笔记(15)—— Android中的状态保存探究(下)
原文:Android菜鸟的成长笔记(15)—— Android中的状态保存探究(下)
在上一篇中我们简单了解关于Android中状态保存的过程和原理,这一篇中我们来看一下在系统配置改变的情况下保存数据及恢复数据的过程。
下面我们先来看一个现象:(代码在 Android中状态保存探究(上)中)
先启动应用如下:
打印的Log
再翻转屏幕
打印的Log如下
可以看到每翻转一次屏幕实际上系统会停止原理的activity并销毁然后重新启动一次,在这个过程中会调用onSaveInstanceState方法来保存原来的数据并通过onCreate方法恢复数据。因为要先onDestroy然后才onCreate,所以就会出现一个黑屏(闪屏)的短暂过程。像这种改变整个系统配置的现象叫做ConfigurationChanges.
ConfigurationChange具体有哪些,都代表什么,请看:http://developer.android.com/reference/android/R.attr.html#configChanges
| Constant | Value | Description |
|---|---|---|
mcc |
0x0001 | The IMSI MCC has changed, that is a SIM has been detected and updated the Mobile Country Code. |
mnc |
0x0002 | The IMSI MNC has changed, that is a SIM has been detected and updated the Mobile Network Code. |
locale |
0x0004 | The locale has changed, that is the user has selected a new language that text should be displayed in. |
touchscreen |
0x0008 | The touchscreen has changed. Should never normally happen. |
keyboard |
0x0010 | The keyboard type has changed, for example the user has plugged in an external keyboard. |
keyboardHidden |
0x0020 | The keyboard or navigation accessibility has changed, for example the user has slid the keyboard out to expose it. Note that despite its name, this applied to any accessibility: keyboard or navigation.键盘隐藏 |
navigation |
0x0040 | The navigation type has changed. Should never normally happen.导航 |
orientation |
0x0080 | The screen orientation has changed, that is the user has rotated the device.屏幕翻转 |
screenLayout |
0x0100 | The screen layout has changed. This might be caused by a different display being activated.屏幕布局改变 |
uiMode |
0x0200 | The global user interface mode has changed. For example, going in or out of car mode, night mode changing, etc. |
screenSize |
0x0400 | The current available screen size has changed. If applications don't target at least HONEYCOMB_MR2 then the activity will always handle this itself (the change will not result in a restart). This represents a change in the currently available size, so will change when the user switches between landscape and portrait. |
smallestScreenSize |
0x0800 | The physical screen size has changed. If applications don't target at least HONEYCOMB_MR2 then the activity will always handle this itself (the change will not result in a restart). This represents a change in size regardless of orientation, so will only change when the actual physical screen size has changed such as switching to an external display. |
layoutDirection |
0x2000 | The layout direction has changed. For example going from LTR to RTL. |
fontScale |
0x40000000 | The font scaling factor has changed, that is the user has selected a new global font size.字体大小 |
有时候我们需要在配置改变的时候恢复一些不能够序列化的对象,这时候就需要用onRetainNonConfigurationInstance方法保存,然后在onCreate方法中通过getLastNonConfigurationInstance获取对象。但是要注意的是,保存的对象不要用与context关联的对象,比如View,否则会引起内存泄露。
有没有什么方法在Configuration改变的时候不重新启动Activity,在manifest文件中我们来看一下一个配置:
好吧,先配上orientation值,我们再去Activity中添加一段代码,如下:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i("大碗干拌", "调用了onConfiguration onChanged方法");
if(newConfig.equals(Configuration.ORIENTATION_LANDSCAPE)){
Log.i("大碗干拌", "切换到了横屏");
}else if(newConfig.equals(Configuration.ORIENTATION_PORTRAIT)){
Log.i("大碗干拌", "切换到了竖屏");
}
}
这个时候切换屏幕时系统会调用onConfigurationChanged方法,来处理我们自定义的配置改变。而不会去重新启动新的Activity。
Android菜鸟的成长笔记(15)—— Android中的状态保存探究(下)的更多相关文章
- Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)
原文:[置顶] Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上) 我们在用手机的时候可能会发现,即使应用被放到后台再返回到前台数据依然保留(比如说我们正在玩游戏,突然电话 ...
- Android菜鸟的成长笔记(11)——Android中的事件处理
原文:[置顶] Android菜鸟的成长笔记(11)——Android中的事件处理 Android提供了两种方式来处理事件,一个是基于回调的事件处理,另一个是基于监听的事件处理,举个例子: 基于回调的 ...
- Android菜鸟的成长笔记(17)—— 再看Android中的Unbounded Service
原文:Android菜鸟的成长笔记(17)-- 再看Android中的Unbounded Service 前面已经写过关于startService(Unbounded Service)的一篇文章:&l ...
- Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy
原文:Android菜鸟的成长笔记(3)--给QQ登录界面说So Easy 上一篇:Android菜鸟的成长笔记(2)--第一个Android应用 我们前面已经做了第一个Android应用程序,虽然有 ...
- Android菜鸟的成长笔记(2)——第一个Android应用
原文:Android菜鸟的成长笔记(2)--第一个Android应用 上一篇:Android菜鸟的成长笔记(1)--Anddroid环境搭建从入门到精通 在上一篇Android菜鸟的成长笔记(1)中我 ...
- Android菜鸟的成长笔记(1)——Android开发环境搭建从入门到精通
原文:Android菜鸟的成长笔记(1)--Android开发环境搭建从入门到精通 今天在博客中看到好多Android的初学者对Android的开发环境的搭建不熟悉而导致不能进行学习,所以我决定自己写 ...
- Android菜鸟的成长笔记(13)——异步任务(Async Task)
原文:[置顶] Android菜鸟的成长笔记(13)——异步任务(Async Task) Android的UI线程主要负责处理用户的事件及图形显示,因此主线程UI不能阻塞,否则会弹出一个ANR(App ...
- Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue
原文:[置顶] Android菜鸟的成长笔记(12)——Handler.Loop.MessageQueue 当一个程序第一次启动时,Android会启动一条主线程(Main Thread),主线程主要 ...
- Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值
原文:[置顶] Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值 前面我们了解了如何启动一个Activity,一个Activity在启动另外一个Activity的时候 ...
随机推荐
- hdu 1240 Asteroids!(BFS)
题目链接:点击链接 简单BFS,和二维的做法相同(需注意坐标) 题目大意:三维的空间里,给出起点和终点,“O”表示能走,“X”表示不能走,计算最少的步数 #include <iostream&g ...
- C# openfiledialog设置filter属性后达不到过滤效果的原因之一
此处用RichTextBox控件举例>>> 在窗体对应的类中处理Load事件可以为openfiledialog设置Filter的属性: private void Form1_Load ...
- android 自己定义通知栏遇到的问题
首先看报错信息: E/AndroidRuntime(12220): FATAL EXCEPTION: main E/AndroidRuntime(12220): Process: gn.com.and ...
- 定义自己的布局RelativeLayout
绘制网格线
在Android画线必须由一个载体,无论是控制,无论是布局.实际上它们是从继承View.由画线的方式自己的控制或布局的定义是最常见的. 以下是在其定义中的小样本实现RelativeLayout绘制网络 ...
- Visual Assist X 10.8.2052的Crack破解补丁. 2014.11.05 (General release.)
VA小组立即更新频率似有些放缓几乎,版本号都是2个月才更新一次,而这次的更新幅度也还是比較大的,新增了6个特性,而且修正和20余处大大小小的问题,而且也是正式发行版,推荐更新. 对于破解补丁还是老规矩 ...
- poj2245Lotto(最基础的dfs)
题目链接: 啊哈哈,点我点我 思路:最開始画好搜索状态,然后找好结束条件,最好预推断当前找到的个数和能够找到的是否大于6就可以.. 题目: Lotto Time Limit: 1000MS Mem ...
- SimpleDateFormat 的线程安全问题与解决方式
SimpleDateFormat 的线程安全问题 SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的详细类. 它同意格式化 (date -> text).语法分析 (te ...
- nginx 301跳转到带www域名方法rewrite(转)
首先一.得在你的域名管理里面定义 test.com和www.test.com指向你的主机ip地址,我们可以使用nslookup命令测试:直接输入 nslookup test.com和nslookup ...
- String数组必须初始化之后才能赋值
犯了一个很大的错误: String sample[]=null; sample[]="hello"; samlple[]="world"; 直接就报异常了. 记 ...
- hdu1507--二分图最大匹配
题意:你大爷.哦不! 你大叔继承了一块地什么的都是废话..,这里说说题意,和怎么建图. 题意:这里有一块N*M的地,可是有 K 个地方.是池塘,然后输入K行(x,y),OK,如今能够出售的地必须是 1 ...