横屏切换竖屏Activity的生命周期及configChanges

        曾经遇到过一个面试题,让你写出横屏切换竖屏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|screenSize|keyboardHidden"(sdk>13时需加上screenSize),执行步骤3,就只打印onConfigChanged

onConfigurationChanged-->

8、执行步骤4

onConfigurationChanged-->
onConfigurationChanged-->

 总结:

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

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

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

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

 


总结一下整个Activity的生命周期

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

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

Activity未被完全覆盖只是失去焦点:onPause--->onResume




Activity中ConfigChanges属性的用法:
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.全局字体大小缩放发生改变
"uiMode"     The user interface mode has changed — this can be caused when the user places the device into a desk/car dock or when the the night mode changes. See                 UiModeManager. Introduced in API Level 8.
"orientation"     The screen orientation has changed — the user has rotated the device.

               Note: If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), then you should also declare the "screenSize"    configuration, because it also changes when a device switches between portrait and landscape orientations.

"screenSize"     The current available screen size has changed. This represents a change in the currently available size, relative to the current aspect ratio, so will change
                when the user switches between landscape and portrait. However, if your application targets API level 12 or lower, then your activity always handles this
                configuration change itself (this configuration change does not restart your activity, even when running on an Android 3.2 or higher device).
                Added in API level 13.

"smallestScreenSize"     The physical screen size has changed. 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. A change to this configuration corresponds to a change in the smallestWidth configuration. However,
               if your application targets API level 12 or lower, then your activity always handles this configuration change itself (this configuration change does not restart
               your activity, even when running on an Android 3.2 or higher device).
               Added in API level 13.






没有更多推荐了,返回首页