您的位置:首页 > 移动开发 > Android开发

Android - Activity 生命周期

2016-04-22 21:00 323 查看
本文主要参考这篇文章和任玉刚的《Android开发艺术探索》一书,谢谢两位作者!

经典的activity生命周期图(图片来源于网络):



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时,如果新的activity采用了透明主题等,那么,当前activity不会回调onStop方法:



对上面的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、横竖屏切换时:



在Activity异常终止的情况下,系统会调用on
aeda
SaveInstanceState方法来保存当前Activity的状态,当Activity被重新创建之后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法,在恢复数据时,选择onRestoreInstanceState和onCreate方法都可以,但二者是有区别的:onRestoreInstanceState方法一旦被调用,其参数(Bundle
savedInstanceState)一定有值,但是,在正常启动的情况下,onCreate方法的(Bundle savedInstanceState)参数值为null,所以如果采用onCreate方法进行数据恢复,就必须要先进行判断,如果savedInstanceState不为null,则说明Activity被重建了,我们就可以取出之前保存的数据进行恢复。另外,从时间上来看,onRestoreInstanceState方法的调用在onStart之后。官方文档建议采用onRestoreInstanceState方法来恢复数据。
E、如果不想让Activity在屏幕旋转的时候重新创建,就可以给configChanges属性添加orientation这个值:



screenSize这个选项比较特殊,它和编译选项有关,当编译选项中的minSdkVersion和targetSdkVersion均低于13时,此选项不会导致Activity重启,否则会导致Activity重启。另外,虽然进行了相关的配置之后,Activity不重启了,但是,系统却调用了onConfigurationChanged方法,这时候就可以按照需求进行相应的处理了。
F、指定横竖屏:
可以在清单文件中设置android:screenOrientation="portrait",或是在Java文件中使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);指定为竖屏,
在清单文件中设置android:screenOrientation="landscape",或是在Java文件中使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);指定为横屏,
在这两种情况下,屏幕方向发生改变时,没有任何方法被调用。
G、退出Activity:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android