文档章节

  [Android] Activity ConfigChanges属性

枫兮兮
 枫兮兮
发布于 2014/02/25 16:59
字数 965
阅读 3714
收藏 2

通过设置这个属性可以使Activity捕捉设备状态变化,以下是可以被识别的内容: 
设置方法:将下列字段用“|”符号分隔开,例如:“locale|navigation|orientation

Value Description
mcc The IMSI mobile country code (MCC) has changed — that is, a SIM hasbeen detected and updated the MCC.移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
mnc The IMSI mobile network code (MNC) has changed — that is, a SIM hasbeen detected and updated the MNC.移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
locale The locale has changed — for example, the user has selected a new language that text should be displayed in.用户所在地区发生变化。
touchscreen The touchscreen has changed. (This should never normally happen.)
keyboard The keyboard type has changed — for example, the user has plugged in an external keyboard.键盘模式发生变化,例如:用户接入外部键盘输入
keyboardHidden The keyboard accessibility has changed — for example, the user has slid the keyboard out to expose it.用户打开手机硬件键盘
navigation The navigation type has changed. (This should never normally happen.)
orientation The screen orientation has changed — that is, the user has rotated the device.设备旋转,横向显示和竖向显示模式切换。
fontScale The font scaling factor has changed — that is, the user has selected a new global font size.全局字体大小缩放发生改变

通过一个例子介绍这个属性的用法: 首先需要修改项目的manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.androidres.ConfigChangedTesting"
      android:versionCode="1"
      android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".ConfigChangedTesting"
                  android:label="@string/app_name"
                  android:configChanges="keyboardHidden|orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

在Activity中添加了 android:configChanges属性,目的是当所指定属性(Configuration Changes)发生改变时,通知程序调用 onConfigurationChanged()函数。


横竖屏切换时候activity的生命周期 android:configChanges

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

今天遇到一个面试题,让写出横屏切换竖屏Activity的生命周期。以前好像看到过,当时没用,于是没注意,结果今天有这个题。

网上查了下,总结下:

1、新建一个Activity,并把各个生命周期打印出来

2、运行Activity,得到如下信息

onCreate-->

onStart-->

onResume-->

3、按crtl+f12切换成横屏时

onSaveInstanceState-->

onPause-->

onStop-->

onDestroy-->

onCreate-->

onStart-->

onRestoreInstanceState-->

onResume-->

4、再按crtl+f12切换成竖屏时,发现打印了两次相同的log

onSaveInstanceState-->

onPause-->

onStop-->

onDestroy-->

onCreate-->

onStart-->

onRestoreInstanceState-->

onResume-->

onSaveInstanceState-->

onPause-->

onStop-->

onDestroy-->

onCreate-->

onStart-->

onRestoreInstanceState-->

onResume-->

5、修改AndroidManifest.xml,把该Activity添加 android:configChanges="orientation",执行步骤3

onSaveInstanceState-->

onPause-->

onStop-->

onDestroy-->

onCreate-->

onStart-->

onRestoreInstanceState-->

onResume-->

6、再执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged

onSaveInstanceState-->

onPause-->

onStop-->

onDestroy-->

onCreate-->

onStart-->

onRestoreInstanceState-->

onResume-->

onConfigurationChanged-->

7、把步骤5的android:configChanges="orientation" 改成 android:configChanges="orientation|keyboardHidden",执行步骤3,就只打印onConfigChanged

onConfigurationChanged-->

8、执行步骤4

onConfigurationChanged-->

onConfigurationChanged-->

总结:

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

补充一点,当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变

Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState --> onPause --> onStop      onRestart -->onStart--->onResume


© 著作权归作者所有

枫兮兮
粉丝 14
博文 72
码字总数 27211
作品 0
成都
私信 提问
加载中

评论(2)

请叫我灰灰
请叫我灰灰
真心写的不错,顶!
KaneTing
KaneTing
写的这么好,居然没有人留言。。。。。我顶楼主!!!
安卓 清单文件(AndroidManifest.xml)知识点扫盲

1、android:excludeFromRecents="true" 是否允许在最近打开的activity列表(查看后台运行程序)中显示,true表示不允许,默认是false,允许 2、android:screenOrientation="portrait" activi......

Carbenson
2018/11/05
80
0
android:configChanges属性

APP运行时,一些设备的配置可能会改变,如:横竖屏的切换、键盘的可用性等会导致Activity重启,即oncreate会被再次调用, 如果oncreate方法中有向服务器请求的方法,那么悲剧就会发生,相当于...

姬鑫
2015/01/27
1K
0
AndroidManifest.xml

跪求APP高人,入手一只卡西欧蓝牙手表G-6900B,一款支持安卓系统的蓝牙手表。当时没有注意该手表的G-SHOCK+应用所支持的手机,以为只要是安卓4.2.2的系统就能使用,结果该应用软件只能在三星...

剩点布
2013/10/31
437
1
Android4: 旋转屏幕时禁止Activity重启

我们知道,Andorid旋转屏幕时默认是重新Create Activity,之前我们可以 在AndroidManifest.xml 中添加activity属性android:configChanges="orientation" 来声明Acitivity自己处理orientaion,......

长平狐
2012/06/20
310
1
Android屏幕旋转时Activity不重新调用onCreate的方法

android屏幕旋转时Activity不重新调用onCreate的方法 当手机转屏时,Activity的onDestroy和onCreate方法会被调用 为了避免Activity在转屏时销毁: 1)修改AndroidManifest.xml 在activity属性...

维特的烦恼
2014/02/07
2.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

PhotoShop 高级应用:USM锐化/S锐化/防抖

、 高反差锐化+混合模式:叠加模式 【将更多的边缘细节添加到图像中】

东方墨天
24分钟前
6
0
Python数据可视化之matplotlib

常用模块导入 import numpy as npimport matplotlibimport matplotlib.mlab as mlabimport matplotlib.pyplot as pltimport matplotlib.font_manager as fmfrom mpl_toolkits.mplot3d i......

松鼠大帝
昨天
5
0
我用Bash编写了一个扫雷游戏

我在编程教学方面不是专家,但当我想更好掌握某一样东西时,会试着找出让自己乐在其中的方法。比方说,当我想在 shell 编程方面更进一步时,我决定用 Bash 编写一个扫雷游戏来加以练习。 我在...

老孟的Linux私房菜
昨天
7
0
Go语言Hello world(GOPATH和Go Module版)

本文是「vangoleo的Go语言学习笔记」系列文章之一。 官网: http://www.vangoleo.com/go/go-hello-world-02/ 往期回顾: Go语言入门-你好,Go语言 Go语言入门-Hello World(Go Playground版) 上...

vangoleo
昨天
9
0
C++虚函数以及虚函数表

在了解虚函数之前先了解下对象模型: 对象模型: 在C++中,有两种数据成员(class data members):static 和nonstatic,以及三种类成员函数(class member functions):static、nonstatic和v...

黑白双键
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部