本文主要参考这篇文章和任玉刚的《android开发艺术探索》一书,谢谢两位作者!
7个方法简单描述如下:
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、第一次进入:
B、按home键、锁屏键和打开最近使用的程序列表:
C、跳转到新的activity时(比如从MainActivity跳转到SecondActivity):
D、其中比较特殊的是:
在跳转到新的activity时,如果新的activity采用了透明主题,那么,当前activity不会回调onStop方法,因跳转后当前activity只是失去了焦点,但是仍然可见。
如将
SecondActivity 的主题设置为:
@android:style/Theme.Translucent 或者是 @android:style/Theme.Dialog ,那么
E、现在来个稍微复杂点的,进一步理解activity各个生命周期的方法:
从上边的 D 部分我们已经知道,假设将SecondActivity 的主题设置为:@android:style/Theme.Translucent 或者是 @android:style/Theme.Dialog,
那么,从
MainActivity跳转到SecondActivity 时,方法调用情况如下:
现在的问题是,如果这个时候按home键,再从最近打开的程序列表进入应用时,方法的调用顺序又是什么呢?
分析:
按下home键时,MainActivity从 可见但是没有焦点 的状态进入 不可见状态,但是还没有被销毁掉,所以onStop方法执行。而SecondActivity从 可见并且有焦点 的状态进入 不可见状态,同样还没有被销毁,所以方法调用顺序为onPause--onStop。
重新打开时,MainActivity和SecondActivity都是从不可见状态重新变为可见状态,所以两者的onRestart方法都会执行,而重新打开之后,MainActivity是可见但没有焦点的状态,SecondActivity则是可见并且有焦点的状态,所以方法调用情况就如上图所示。
对上面的log显示情况做一下简单总结:
一、onStart和onResume方法、onPause和onStop方法从描述上看是差不多的,在一般情况下,没有明显的区别,他们总是成对的出现,并且onStop方法总是接着onPause得到执行,但在有些情况下,只会执行onPause而不会执行onStop,比如上边的 D ,而这就可以看出onPause和onStop的某些区别(onStart和onResume同理)。
二、onSaveInstanceState方法的调用时机是在onStop之前,但它和onPause到底谁先被调用,还未找到依据。在本文开头提到的文章中,作者的测试显示onSaveInstanceState先执行,而本文中测试结果则显示onSaveInstanceState后执行。
三、在以上的测试中,只有onSaveInstanceState方法被调用了,而onRestoreInstanceState方法却并没有被调用。采用《android开发艺术探索》一书中的话来说,系统只会在Activity即将被销毁并且有机会重新显示的情况下才会去调用onRestoreInstanceState方法,如:
F、横竖屏切换时:
另外,从上文可以看出: onSaveInstanceState 方法在以下情况会被调用:
1、按下home键、锁屏键和打开最近使用的程序列表
2、打开新的activity
3、横竖屏切换并且activity被销毁时
G、如果不想让Activity在屏幕旋转的时候重新创建,就可以给configChanges属性添加orientation这个值:
H、指定横竖屏:
可以在清单文件中设置android:screenOrientation="portrait",或是在Java文件中使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);指定为竖屏,
在清单文件中设置android:screenOrientation="landscape",或是在Java文件中使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);指定为横屏,
在这两种情况下,屏幕方向发生改变时,没有任何方法被调用。
I、退出Activity: