Android 开发四大基本组件之一——Activity详解

一、Activty的生命周期图:


1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。

3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

 

一个Activity的启动顺序:

onCreate()——>onStart()——>onResume()

当另一个Activity启动时:

第一个Activity onPause()——>第二个Activity  onCreate()——>onStart()——>onResume() 

——>第一个Activity   onStop()

 

当返回到第一个Activity时:

第二个Activity onPause() ——> 第一个Activity onRestart()——>onStart()——>onResume() 

——>第二个Activity   onStop()——>onDestroy()

 

一个Activity的销毁顺序:

(情况一)onPause()——><Process Killed> 

(情况二)onPause()——>onStop()——><Process Killed> 

(情况三)onPause()——>onStop()——>onDestroy()

 

1、整个的生命周期,从onCreate(Bundle)开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在onDestory()释放所有的资源。例如:某个Activity有一个在后台运行的线程,用于从网络下载数据,则该Activity可以在onCreate()中创建线程,在onDestory()中停止线程。

2、可见的生命周期,从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart中注册一个IntentReceiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。

3、前台的生命周期,从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有 Activity的最前面,和用户进行交互。Activity可以经常性地在resumed和paused状态之间切换,例如:当设备准备休眠时,当一个 Activity处理结果被分发时,当一个新的Intent被分发时。所以在这些接口方法中的代码应该属于非常轻量级的。

当avtivity处于活跃状态时如下操作时会执行这些函数

1.弹出对话框样式的Activity时或半透时:onSaveInstanceState()-->onpause()

2.跳转Activity时:onSaveInstanceState()-->onPause()-->onStop()

3.按下home键时:onSaveInstanceState()-->onPause()-->onStop()

4.按下返回键时:onPause()-->onStop()-->onDestroy()

5.竖切横屏时:onSaveInstanceState-->onPause()-->onStop()-->onDestroy()--|-->onCreate()--onStart()-->onRestoreInstanceState()-->onResume()

6.横切竖屏时:onSaveInstanceState-->onPause()-->onStop()-->onDestroy()--|-->onCreate()--onStart()-->onRestoreInstanceState()-->onResume()-->onSaveInstanceState-->onPause()-->onStop()-->onDestroy()--|-->onCreate()--onStart()-->onRestoreInstanceState()-->onResume()

当设置Android:configChanges="orientation" 竖-->横,执行一次且不执行执行onConfigurationChanged

横-->竖,执行一次且执行onConfigurationChanged一次

当设置android:configChanges="orientation|keyboardHidden"竖-->横,只执行onConfigurationChanged

横-->竖,只执行onConfigurationChanged两次。

其onSaveInstanceState方法会在什么时候被执行,有这么几种情况: 

1、当用户按下HOME键时。 这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则 

2、长按HOME键,选择运行其他的程序时。 

3、按下电源按键(关闭屏幕显示)时。 

4、从activity A中启动一个新的activity时。 

5、屏幕方向切换时,例如从竖屏切换到横屏时。 在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行   总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则 onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。   

至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,(本人注:我昨晚调试时就发现原来不一定成对被调用的!)

onRestoreInstanceState的执行是在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方法

猜你喜欢

转载自jishudaren.iteye.com/blog/2296183