原文: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中的状态保存探究(下)的更多相关文章

  1. Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)

    原文:[置顶] Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上) 我们在用手机的时候可能会发现,即使应用被放到后台再返回到前台数据依然保留(比如说我们正在玩游戏,突然电话 ...

  2. Android菜鸟的成长笔记(11)——Android中的事件处理

    原文:[置顶] Android菜鸟的成长笔记(11)——Android中的事件处理 Android提供了两种方式来处理事件,一个是基于回调的事件处理,另一个是基于监听的事件处理,举个例子: 基于回调的 ...

  3. Android菜鸟的成长笔记(17)—— 再看Android中的Unbounded Service

    原文:Android菜鸟的成长笔记(17)-- 再看Android中的Unbounded Service 前面已经写过关于startService(Unbounded Service)的一篇文章:&l ...

  4. Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy

    原文:Android菜鸟的成长笔记(3)--给QQ登录界面说So Easy 上一篇:Android菜鸟的成长笔记(2)--第一个Android应用 我们前面已经做了第一个Android应用程序,虽然有 ...

  5. Android菜鸟的成长笔记(2)——第一个Android应用

    原文:Android菜鸟的成长笔记(2)--第一个Android应用 上一篇:Android菜鸟的成长笔记(1)--Anddroid环境搭建从入门到精通 在上一篇Android菜鸟的成长笔记(1)中我 ...

  6. Android菜鸟的成长笔记(1)——Android开发环境搭建从入门到精通

    原文:Android菜鸟的成长笔记(1)--Android开发环境搭建从入门到精通 今天在博客中看到好多Android的初学者对Android的开发环境的搭建不熟悉而导致不能进行学习,所以我决定自己写 ...

  7. Android菜鸟的成长笔记(13)——异步任务(Async Task)

    原文:[置顶] Android菜鸟的成长笔记(13)——异步任务(Async Task) Android的UI线程主要负责处理用户的事件及图形显示,因此主线程UI不能阻塞,否则会弹出一个ANR(App ...

  8. Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue

    原文:[置顶] Android菜鸟的成长笔记(12)——Handler.Loop.MessageQueue 当一个程序第一次启动时,Android会启动一条主线程(Main Thread),主线程主要 ...

  9. Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值

    原文:[置顶] Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值 前面我们了解了如何启动一个Activity,一个Activity在启动另外一个Activity的时候 ...

随机推荐

  1. Amazon.com: NEW VI AND VIM EDITOR KEYBOARD STICKER: Office Products

    Amazon.com: NEW VI AND VIM EDITOR KEYBOARD STICKER: Office Products NEW VI AND VIM EDITOR KEYBOARD S ...

  2. DIV固定在页面某个位置,不随鼠标滚动而滚动

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org ...

  3. stripslashes和addslashes的区别

    我们在向mysql写入数据时,比如: mysql_query(”update table set `title`=’kuhanzhu’s blog’”); 那就会出错.同asp时一样,数据库都会对单引 ...

  4. iOS App 性能优化总结

    今天简单总结一些clientapp 优化的方案和方向. 我相信开发一个app大部分团队都能够完毕,可是性能久不一样啦,和我们都写一个冒泡算法一样,我相信每一个人写的冒泡算法都不一样,这些区别就带来了性 ...

  5. ZOJ 3635 Cinema in Akiba(线段树)

    Cinema in Akiba (CIA) is a small but very popular cinema in Akihabara. Every night the cinema is ful ...

  6. 【译】ASP.NET MVC 5 教程 - 8:搜索查询

    原文:[译]ASP.NET MVC 5 教程 - 8:搜索查询 添加一个搜索的方法和搜索的视图 在本节中,我们为 Index 方法添加查询功能,使我们能够根据电影的题材或名称进行查找. 修改 Inde ...

  7. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第二步---编辑器(1)--触摸加入点

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写,第一别全然照搬代码:第二能够说 ...

  8. CSDN开源夏令营 百度数据可视化实践 ECharts(8)问题分析

    ECharts问题描写叙述: 问题就是折线图上的点是显示的,有人问能不能一開始不显示,当你点击的时候或者是当鼠标移动到上面的时候,折线上的点才显示? 例如以下图所看到的: 分析:让折线上的点不显示能够 ...

  9. RESTEasy:@FormParam、@PathParam、@QueryParam、@HeaderParam、@CookieParam、@MatrixParam说明

    在第一RESTEasy教程我们已经学习了基本的Web服务和休息我们已经测试了一个简单的REST风格的Web服务.在本教程中,我们将显示如何将Web应用程序元素(形式参数,查询参数和更多)为REST风格 ...

  10. 李林APUE之进程的封装

    1.子进程是父进程的副本,获得父进程的数据空间/堆/栈,父子进程共享代码段.子进程从fork后開始运行.返回值=0表示子进程,由于子进程能够通过函数来获取父进程的ID,可是父进程无法知道子进程的ID. ...