Activity声明周期的完全解析

来源:互联网 发布:windows自带放大镜 编辑:程序博客网 时间:2024/05/16 14:08

在Android开发中最常用到的一个类就是Activity,想要随心所欲的运用Activity,就要熟练的掌握Activity的声明周期,为了更好的了解Activity的声明周期及运行过程,最近写了一个小Demo,测试了一下,下面是我的一些执行过程和打印出的log:

1.Activity的创建:


03-21 00:05:05.099 7803-7803/com.example.wls.myapplication D/print: onCreate: *************
03-21 00:05:05.099 7803-7803/com.example.wls.myapplication D/print: onStart: *************
03-21 00:05:05.099 7803-7803/com.example.wls.myapplication D/print: onResume: *************


毫无疑问,首次创建Activity时,肯定是依次调用onCreate(),onStart(),onResume(),此时Activity被创建

Activity被创建时调用OnCreate(),当Activity处于可见状态时,就会调用OnStart(),当Activity可以达到用户焦点的时候会调用OnResume()

2、正常退出:


03-21 00:06:29.159 7803-7803/com.example.wls.myapplication D/print: onPause: *************
03-21 00:06:29.599 7803-7803/com.example.wls.myapplication D/print: onStop: *************
03-21 00:06:29.599 7803-7803/com.example.wls.myapplication D/print: onDestroy: *************


同样,正常退出的情况下依次调用:onPause(), onStop(),onDestroy()Activity此时被销毁

当Activity被遮挡住的时候就会调用OnPause(),当Activity处于不可见时调用OnStop(),当Activity被销毁时,调用OnDestory()

3、Activity创建后,执行Home键:


03-21 00:08:02.819 7803-7803/com.example.wls.myapplication D/print: onPause: *************
03-21 00:08:03.279 7803-7803/com.example.wls.myapplication D/print:  onSaveInstanceState: *************1
03-21 00:08:03.279 7803-7803/com.example.wls.myapplication D/print: onStop: *************


按下Home键后,调用了 onPause(),onSaveInstanceState(),onStop(),其中的1是我设置的一个常量,初始化为0,在onResume()中自动加1,并没有调用onDestroy()说明Activity并没有被销毁

4.按下Home键后,再打开Activity:


03-21 00:09:41.009 7803-7803/com.example.wls.myapplication D/print: onRestart: *************
03-21 00:09:41.019 7803-7803/com.example.wls.myapplication D/print: onStart: *************
03-21 00:09:41.019 7803-7803/com.example.wls.myapplication D/print: onResume: *************


Activity没有被销毁所以不许创建,只要调用onRestart()即可,又依次调用了OnStart(),OnResume()

5、由竖屏强制切换为横屏:


03-21 00:11:18.439 7803-7803/com.example.wls.myapplication D/print: onPause: *************
03-21 00:11:18.439 7803-7803/com.example.wls.myapplication D/print:  onSaveInstanceState: *************2
03-21 00:11:18.439 7803-7803/com.example.wls.myapplication D/print: onStop: *************
03-21 00:11:18.439 7803-7803/com.example.wls.myapplication D/print: onDestroy: *************


03-21 00:11:18.499 7803-7803/com.example.wls.myapplication D/print: onCreate: *************
03-21 00:11:18.499 7803-7803/com.example.wls.myapplication D/print: onStart: *************
03-21 00:11:18.499 7803-7803/com.example.wls.myapplication D/print:  onRestoreInstanceState: *************0
03-21 00:11:18.499 7803-7803/com.example.wls.myapplication D/print: onResume: *************


由以上可见,先是调用了OnPause(),onSaveInstanceState(), onStop(),onDestroy(),调用了OnDestory()说明Activity被销毁了

紧接着又调用了onCreate(),onStart(),OnRestoreInstanceState(),onResume(),总体来说调用行了一个Activity的完整的生命周期

6、由横屏强制切换为竖屏:


03-21 00:17:57.609 7803-7803/com.example.wls.myapplication D/print: onPause: *************
03-21 00:17:57.609 7803-7803/com.example.wls.myapplication D/print:  onSaveInstanceState: *************1
03-21 00:17:57.609 7803-7803/com.example.wls.myapplication D/print: onStop: *************
03-21 00:17:57.609 7803-7803/com.example.wls.myapplication D/print: onDestroy: *************


03-21 00:17:57.679 7803-7803/com.example.wls.myapplication D/print: onCreate: *************
03-21 00:17:57.689 7803-7803/com.example.wls.myapplication D/print: onStart: *************
03-21 00:17:57.689 7803-7803/com.example.wls.myapplication D/print:  onRestoreInstanceState: *************0
03-21 00:17:57.689 7803-7803/com.example.wls.myapplication D/print: onResume: *************


由5可知,这两个操作执行的方法完全一致,都是调用了一次Activity完整的声明


7、在AndroidManifest中这只了Android:configChanges="orientation"时,有竖屏强制切为横屏时:


03-21 00:26:32.609 13266-13266/com.example.wls.myapplication D/print: onPause: *************
03-21 00:26:32.619 13266-13266/com.example.wls.myapplication D/print:  onSaveInstanceState: *************1
03-21 00:26:32.619 13266-13266/com.example.wls.myapplication D/print: onStop: *************
03-21 00:26:32.619 13266-13266/com.example.wls.myapplication D/print: onDestroy: *************


03-21 00:26:32.709 13266-13266/com.example.wls.myapplication D/print: onCreate: *************
03-21 00:26:32.709 13266-13266/com.example.wls.myapplication D/print: onStart: *************
03-21 00:26:32.709 13266-13266/com.example.wls.myapplication D/print:  onRestoreInstanceState: *************0
03-21 00:26:32.709 13266-13266/com.example.wls.myapplication D/print: onResume: *************


和之前没有设置时是完全一样的

8、在AndroidManifest中这只了Android:configChanges="orientation"时,有横强制切为竖屏时:


此时没有打印任何的log信息,可见并没有调用任何的生命周期方法,就连 onConfigurationChanged方法也没有执行


9、AndroidManifest中这只了Android:configChanges="orientation|keyboardHidden"有竖屏强制切为横屏时:


03-21 00:33:02.329 21077-21077/com.example.wls.myapplication D/print: onConfigurationChanged: *************
03-21 00:33:02.329 21077-21077/com.example.wls.myapplication D/print: onPause: *************
03-21 00:33:02.339 21077-21077/com.example.wls.myapplication D/print:  onSaveInstanceState: *************1
03-21 00:33:02.339 21077-21077/com.example.wls.myapplication D/print: onStop: *************
03-21 00:33:02.339 21077-21077/com.example.wls.myapplication D/print: onDestroy: *************


03-21 00:33:02.419 21077-21077/com.example.wls.myapplication D/print: onCreate: *************
03-21 00:33:02.419 21077-21077/com.example.wls.myapplication D/print: onStart: *************
03-21 00:33:02.419 21077-21077/com.example.wls.myapplication D/print:  onRestoreInstanceState: *************0
03-21 00:33:02.419 21077-21077/com.example.wls.myapplication D/print: onResume: *************

设置Android:configChanges="orientation|keyboardHidden"之后,由竖屏切横屏时,只在最前面调用了onConfigurationChanged()方法

10、AndroidManifest中这只了Android:configChanges="orientation|keyboardHidden"时,由横强制切为竖屏时:

03-21 00:35:14.299 21077-21077/com.example.wls.myapplication D/print: onConfigurationChanged: *************

此时只调用onConfigurationChanged()这个方法

11、Activitya跳转到Activityb时,他们各自生命周期的执行顺序:


03-21 17:41:51.610 22297-22297/com.example.wls.myapplication D/print: onPause: *************


03-21 17:41:51.690 22297-22297/com.example.wls.myapplication D/print: onCreate: B*************
03-21 17:41:51.690 22297-22297/com.example.wls.myapplication D/print: onStart: B*************
03-21 17:41:51.700 22297-22297/com.example.wls.myapplication D/print: onResume: B*************


03-21 17:41:52.150 22297-22297/com.example.wls.myapplication D/print:  onSaveInstanceState: *************1
03-21 17:41:52.150 22297-22297/com.example.wls.myapplication D/print: onStop: *************


由Log日志可知,当Activitya跳转到Activityb时,首先Activitya调用OnPause()方法,然后Activityb开始创建,依次调用了OnCreate(),OnStart(),OnResume(),此时,Activityb已经创建完成,紧接着Activitya又调用了onSaveInstanceState()和OnStop(),没有调用OnDestory()说明Activitya没有被销毁

12、在11的基础上,再从Activityb跳转回Activitya,此时他们各自的生命周期执行先后为:


03-21 17:47:10.000 22297-22297/com.example.wls.myapplication D/print: onPause: B*************


03-21 17:47:10.080 22297-22297/com.example.wls.myapplication D/print: onCreate: *************
03-21 17:47:10.080 22297-22297/com.example.wls.myapplication D/print: onStart: *************
03-21 17:47:10.080 22297-22297/com.example.wls.myapplication D/print: onResume: *************


03-21 17:47:10.590 22297-22297/com.example.wls.myapplication D/print:  onSaveInstanceState: B*************
03-21 17:47:10.590 22297-22297/com.example.wls.myapplication D/print: onStop: B*************


和11的执行顺序完全颠倒了一下,不明白为什么Activitya会调用OnCreate()方法,难道Activity被销毁了,可是并没有打印出Activity执行OnDestory()啊?

13.在11的基础上,按下系统返回键,此时他们的生命周期执行过程又发生了变化:


03-21 17:51:12.650 22297-22297/com.example.wls.myapplication D/print: onPause: B*************
03-21 17:51:12.660 22297-22297/com.example.wls.myapplication D/print: onRestart: *************
03-21 17:51:12.660 22297-22297/com.example.wls.myapplication D/print: onStart: *************
03-21 17:51:12.660 22297-22297/com.example.wls.myapplication D/print: onResume: *************


03-21 17:51:13.050 22297-22297/com.example.wls.myapplication D/print: onStop: B*************
03-21 17:51:13.050 22297-22297/com.example.wls.myapplication D/print: onDestroy: B*************


可见按下系统返回键后,Activitya还调用了OnRestart()方法,而Activityb被销毁掉。

14、当Activity跳转到一个窗口样式的Activity时(此时Activity没有被覆盖),他们各自生命周期执行顺序:


03-21 18:12:33.010 20673-20673/com.example.wls.myapplication D/print: onPause: *************


03-21 18:12:33.060 20673-20673/com.example.wls.myapplication D/print: onCreate: C*************
03-21 18:12:33.060 20673-20673/com.example.wls.myapplication D/print: onStart: C*************
03-21 18:12:33.060 20673-20673/com.example.wls.myapplication D/print: onResume: C*************


可见Activitya只调用了OnPause(),没有执行OnStop(),若Activitya中存在onSaveInstanceState()方法的话,会在c创建后,即在最后面调用onSaveInstanceState()

15.在14的基础上,按下系统返回键,他们各自执行顺序是:


03-21 18:15:53.500 20673-20673/com.example.wls.myapplication D/print: onPause: C*************
03-21 18:15:53.520 20673-20673/com.example.wls.myapplication D/print: onResume: *************


03-21 18:15:53.550 20673-20673/com.example.wls.myapplication D/print: onStop: C*************
03-21 18:15:53.550 20673-20673/com.example.wls.myapplication D/print: onDestroy: C*************


Activityc先调用OnPause()方法,接着Activitya调用了OnResume()方法,然后Activityc执行OnStop()和OnDestory()进行销毁

16、Activity创建后,锁屏再解锁,其生命周期执行顺序:

03-21 18:24:26.690 20673-20673/com.example.wls.myapplication D/print: onPause: *************
03-21 18:24:26.730 20673-20673/com.example.wls.myapplication D/print: onStop: *************


03-21 18:24:32.910 20673-20673/com.example.wls.myapplication D/print: onRestart: *************
03-21 18:24:32.910 20673-20673/com.example.wls.myapplication D/print: onStart: *************
03-21 18:24:32.910 20673-20673/com.example.wls.myapplication D/print: onResume: *************

0 0