Android横竖屏切换时候的activity的生命周期

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

2) 运行activity,得到如下信息:

onCreate()à

onStart()à

onResume()à

    3)  按ctrl+F12切换成横屏时

        onSaveInstanceState()à

        onPause()à

        onStop()à

        onDestroy()à

        onCreate()à

        onStart()à

        onRestoreInstanceState()à

        onResume()à

    4)  再按ctrl+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)  修改AndroidManifest.xml,把该Activity添加android:configChanges=“orientation”,执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged

        onSaveInstanceState()à

        onPause()à

        onStop()à

        onDestroy()à

        onCreate()à

        onStart()à

        onRestoreInstanceState()à

        onResume()à

        onConfigurationChanged()à

    7)  把步骤5的android:configChanges=“orientation”改成

android:configChanges=“orientation|keyboradHidden”,执行步骤3,就只打印onConfigChanged

        onConfigurationChanged()à

    8)  把步骤5的android:configChanges=“orientation”改成

android:configChanges=“orientation|keyboradHidden”,执行步骤4

        onConfigurationChanged()à

        onConfigurationChanged()à

    总结:

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

2) 设置activity的android:configChanges=“orientation”时, 切屏会重新调用各个生命周期,切横屏、竖屏时都只会执行一次,但是竖屏最后多打印一条onConfigurationChanged()

3) 设置activity的android:configChanges=“orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged(),横屏一次,竖屏两次

但是,自从Android 3.2(API 13),在设置Activity的android:configChanges="orientation|keyboardHidden"后,还是一样会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation",你还必须设置"ScreenSize"。

解决方法:

AndroidManifest.xml中设置android:configChanges="orientation|screenSize“

再总结下整个activity的生命周期:

1)  当前activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变

2)  Activity运行时按下HOME键(跟被完全覆盖一样的)

onSavaInstanceStateà

onPauseà

onStopà

 

onRestartà

onStartà

onResumeà

    3)  未被完全覆盖,只是失去焦点:

        onPauseà

        onResumeà

你可能感兴趣的:(横竖屏)