Activity的生命周期及横竖屏的生命周期

Activity 生命周期一览

这里我们先来看看这一张经典的生命周期流程图:
Activity的生命周期及横竖屏的生命周期
相信大部分人对这种流程图并不陌生,嗯,我们下面主要聊得话题就是围绕这张流程图了。我们先有个大概印象,后面我们分析完后再回来看,就相当清晰了。
1.onCreate : 该方法是在Activity被创建时回调,它是生命周期第一个调用的方法,我们在创建Activity时一般都需要重写该方法,然后在该方法中做一些初始化的操作,如通过setContentView设置界面布局的资源,初始化所需要的组件信息等。
2.onStart : 此方法被回调时表示Activity正在启动,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见摆了。
3.onResume : 获取焦点可以和用户交互,因此我们也可以在onResume方法中初始化一些资源,比如重新初始化在onPause或者onStop方法中释放的资源。
4.onPause : 失去焦点(比如activity被完全覆盖了,或者是被dialog给覆盖了)与用户不能产生交互了一般情况下会与onstop()方法一起被调用。
5.onStop : 一般在onPause方法执行完成直接执行,表示Activity即将停止或者完全被覆盖(Stopped形态),此时Activity不可见,仅在后台运行。同样地,在onStop方法可以做一些资源释放的操作(不能太耗时或者保存一些数据onsaveInstant()。
6.onRestart :表示Activity之前并没有被销毁只是执行了onstop()方法被放到了后台现在正在重新启动,当Activity由不可见变为可见状态时,该方法被回调。这种情况一般是用户打开了一个新的Activity时,当前的Activity就会被暂停(onPause和onStop被执行了),接着又回到当前Activity页面时,onRestart方法就会被回调。
7.ondestroy:表示activity被销毁杀死,一般是被finsh()掉了

注意:当activity被dialog覆盖但是并不是完全覆盖的时候,activity只执行onpause()方法,当dialog被消失的时候执行onresume()方法,其他情况被完全覆盖的话如进到新的页面或者按home键推到后台了一般是执行onpause()——onstop()方法;

android横竖屏切换时候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、再切换竖屏,发现不会再打印相同信息,但多打印了一行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方法

Android 固定横竖屏
xml文件中设置:
要实现这个目的,只需要在AndroidManifest.xml里声明Activity的时候加上一个属性: android:screenOrientation=”“,