##Activity 生命周期一览

#####这里我们先来看看这一张经典的生命周期流程图:

#####

activity 切换横竖屏没有调用onDestory 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各种home键锁屏等再进入的生命周期和横竖屏切换时候Activity的生命周期

按手机开关键时,屏幕锁屏,Activity会调用:

03-09 17:13:54.170: I/MainActivity(14576): MainActivity Paused
03-09 17:13:54.220: I/MainActivity(14576): MainActivity Stopped

重新进入手机以后:

03-09 17:14:02.530: I/MainActivity(14576): MainActivity Restarted
03-09 17:14:02.530: I/MainActivity(14576): MainActivity Started
03-09 17:14:02.580: I/MainActivity(14576): MainActivity Resumed

按Home键:

03-10 14:04:00.600: I/MainActivity(10540): MainActivity Paused
03-10 14:04:01.110: I/MainActivity(10540): MainActivity Stopped

重新启动程序:
03-10 14:04:05.370: I/MainActivity(10540): MainActivity Restarted
03-10 14:04:05.370: I/MainActivity(10540): MainActivity Started
03-10 14:04:05.370: I/MainActivity(10540): MainActivity Resumed

按返回键:

03-10 14:42:58.440: I/MainActivity(13062): MainActivity Paused
03-10 14:42:58.930: I/MainActivity(13062): MainActivity Stopped
03-10 14:42:58.940: I/MainActivity(13062): MainActivity Destroyed

重新启动程序:
03-10 14:43:06.120: I/WelcomeActivity(13062): Welcome Activity Created
03-10 14:43:06.120: I/WelcomeActivity(13062): Welcome Activity Started
03-10 14:43:08.200: I/MainActivity(13062): MainActivity Created!
03-10 14:43:08.200: I/MainActivity(13062): MainActivity Started

(横竖屏幕时候)
####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="",