你真的了解Activity的生命周期吗
如需转载请评论或简信,并注明出处,未经允许不得转载
目录
前言
Activity作为四大组件之首,是使用最为频繁的组件,是与用户交互的接口。本文将Activity的生命周期分为两部分内容,分别是正常情况下的生命周期和异常情况下的生命周期
Activity的四种形态
Android系统是通过Activity栈的形式来管理Activity
Activity栈.png
Active:Activtiy处于栈顶
Paused:可见但不可交互
Stopped:不可见
killed:系统回收掉
正常情况下的生命周期
所谓正常情况下的生命周期,是指由用户参与的情况下,Activty所经过的生命周期的改变
正常情况下Activity的生命周期
| 生命周期方法 | 说明 |
|---|---|
| onCreate() | 表示Activity正在被创建,这是生命周期的第一个方法。在这个方法中,我们可以做一些初始化工作,比如调用setContentView去加载页面布局资源、初始化Activity所需数据 |
| onStart() | 表示Activity正在被启动,即将开始,这时候Activity已经可见了,但是还没有出现在前台,即还不能与用户交互 |
| onResume() | 表示Activity已经可见了,并且出现在前台并开始活动,这时候Activity可以和用户进行交互 |
| onPause() | 表示Activity正在停止,正常情况下,紧接着onStop就会被调用。此时可以做一些数据存储,停止动画等工作,但是注意不能太耗时,因为这会影响到新的Activity的显示,onPause必须执行完,新Activity的onResume才会执行 |
| onStop() | 表示Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时 |
| onRestart() | 表示Activity正在重新启动,紧接着会调用onResume
|
| onDestory() | 表示Activity即将被销毁,这是Activity生命周期中的最后一个回调,在这里,我们可以做一些回收工作和最终的资源释放 |
注:打开Dialog、Toast不会影响到Activity的生命周期
异常情况下的生命周期
异常情况下的生命周期是指由于资源内部不足Activity被系统回收 或 由于当前设备的Configuration(如屏幕方向等)发生改变从而导致Activity被销毁重建
异常情况下Activity的生命周期
在异常情况下,onSaveInstanceSate()会保存当前Activity的状态信息,所以我们在这个方法中存储一些数据。当Activity被重新创建之后,系统会调用onRestoreInstanceState(),并且把Activity销毁时onSaveInstanceSate()所保存的Bundle对象作为参数同时传递给onCreate()和onRestoreInstanceState()。因此,我们可以通过onCreate()和onRestoreInstanceState()来判断Activity是否被重建了,如果被重建了,我们就可以取出之前保存的数据并恢复。由于onCreate()方法中的bundle参数可能会空,而onRestoreInstanceState()只有异常情况下才调用所以一定不为空,所以这里推荐在onRestoreInstanceState()中来进行数据恢复
这里要注意的是,onSaveInstanceSate()和onRestoreInstanceState()只会出现在Activity被异常终止的情况下,正常情况下系统不会回调这两个方法
扩展
前面介绍了,当屏幕方向发生变化时,Activtiy就会销毁重建,那么有没有办法不重新创建呢?答案当然是有的!
<activity android:name=".DemoActivity"
android:configChanges="orientation">
</activity>
我们只需要进行配置android:configChanges="orientation"即可,这样当我们旋转屏幕方向时,Activity的生命周期就不会发生变化,而是调用onConfigrationChanged()
这个属性的使用可以包含多个属性,中间用 | 隔开,如android:configChanges="orientation|keyboardHidden"
| VALUE | DESCRIPTION |
|---|---|
| mcc | 国际移动用户识别码所属国家代号是改变了,sim被侦测到了,去更新mcc MCC是移动用户所属国家代号 |
| mnc | 国际移动用户识别码的移动网号码是改变了, sim被侦测到了,去更新mnc MNC是移动网号码,最多由两位数字组成,用于识别移动用户所归属的移动通信网 |
| locale | 用户所在区域发生变化,一般是用户切换了语言时,切换后的语言会显示出来 |
| touchscreen | 触摸屏是改变了------通常是不会发生的 |
| keyboard | 键盘发生了改变----例如用户用了外部的键盘 |
| keyboardHidden | 键盘的可用性发生了改变 |
| navigation | 导航发生了变化-----通常也不会发生 |
| screenLayout | 屏幕的显示发生了变化------不同的显示被激活 |
| fontScale | 字体比例发生了变化----选择了不同的全局字体 |
| uiMode | 用户的模式发生了变化 |
| orientation | 屏幕方向改变了---横竖屏切换 |
| screenSize | 屏幕大小改变了 |
| smallestScreenSize | 屏幕的物理大小改变了,如:连接到一个外部的屏幕上 |
总结
平时很多人往往只关心正常情况下的Activity生命周期,但是了解异常情况下的生命周期,有时候可能能帮助我们解决一些比较棘手的问题