本文主要参考这篇文章和任玉刚的《Android开发艺术探索》一书,谢谢两位作者!
经典的activity生命周期图
(图片来源于网络):
1、
onCreate
:
Activity
被创建时调用
2、onStart:Activity正在被启动,已经可见,但还未出现在前台,还不能和用户进行交互
3、
onResume:
Activity已经可见,并出现在前台,可以和用户进行交互了
4、
onPause:
Activity正在停止,可以做一些存储数据、停止动画等操作,但不能太耗时,因为
onPause必须先执行完,新的
Activity的
onResume才会执行
5、
onStop:同样不能做
太耗时的操作
6、
onDestory:
Activity被销毁时调用
7、
onRestart:
Activity正在被重新启动,一般情况下,当
Activity从不可见重新变为可见时,
onRestart方法就会被调用
下边是7个方法被调用的具体场景:
A、第一次进入:
对上面的log显示情况做一下简单总结:
一、onStart和
onResume
方法
、
onPause和
onStop方法从描述上看是差不多的,在一般情况下,没有明显的区别,
他们总是成对的出现,并且
onStop方法总是接着
onPause得到执行,但在有些情况下,只会执行
onPause而不会执行
onStop,比如上边的C,而这就可以看出
onPause和
onStop的某些区别(
onStart和
onResume同理
)
。
二、
onSaveInstanceState方法的调用时机是在onStop之前,但它和
onPause到底谁先被调用,还未找到依据。在本文开头提到的文章中,作者的测试显示
onSaveInstanceState先执行,而本文中测试结果则显示
onSaveInstanceState后执行。
三、在以上的测试中,只有onSaveInstanceState方法被调用了,而
onRestoreInstanceState
方法却并没有被调用。采用
《android开发艺术探索》一书中的话来说,系统只会在
Activity即将被销毁并且有机会重新显示的情况下才会去调用
onRestoreInstanceState方法,如:
D、横竖屏切换时:
E、如果不想让Activity在屏幕旋转的时候重新创建,就可以给configChanges属性添加orientation这个值:
F、指定横竖屏:
可以在清单文件中设置android:screenOrientation="portrait",或是在Java文件中使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
指定为竖屏,
在清单文件中设置android:screenOrientation="
landscape
",或是在Java文件中使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
指定为横屏,
在这两种情况下,屏幕方向发生改变时,没有任何方法被调用。
G、退出Activity: