作为一个android开发者的必须掌握的其中一条就是activity的生命周期,参与项目的过程中不断地基础activity,一直没有时间对生命周期进行深入的了解,在此重温activit的生命周期,发现新大陆!
Actvity的生命周期
在上图中我们可以看到google已经将一个完整的生命周期呈现给我们,单纯的看图我们能够知道一个activity具有哪些生命周期,但是它到底是如何工作的?
下面以用户的实际操作和系统处理两方面来对其进行解析
用户操作
启动一个界面
用户打开一个界面的时候。
onCreate--onStart--onResume
home键操作离开
当用户按下home键的时候,这是界面进入不可见状态
onPause--onStop
返回界面,复现
复现界面,界面从后台进入或者从另一个界面返回
onReStrat--onStart--onResume
返回键操作(或者执行finish方法)
这是界面进入完全销毁的时机
界面从一个可见状态完全销毁
onPause--onStop--onDestory
系统处理
我们在开发APP的过程中,肯定遇到过对activity的生命周期完全失控,甚至可能打开两个以上的activity,这些问题往往会导致APP逻辑的错误,对此,伟大的google已经帮我们考虑了这些问题,并给出了解决方案
当内存不足,activity被异常销毁
当android手机内存不做的时候,系统会根据当前运行的APP来销毁一些不可见的activity,这时,有可能你需要返回的activity被销毁了,当前用户的操作完全丢失,体验极其糟糕,在android文档中已经给出了这种情况的解决思路
复现
返回来我们来查看activity的生命周期函数,出了onCreate方法外,都是无参的函数,那么在onCreate方法里的参数到底是?
在源码里对参数的解释是
* @param savedInstanceState If the activity is being re-initialized after
* previously being shut down then this Bundle contains the data it most
* recently supplied in {@link #onSaveInstanceState}. <b><i>Note: Otherwise it is null.</i></b>
也就是说在savedInstanceState 里某次被意外销毁后存储数据的bundle
存储
上面已经提到可以得到某次被意外销毁后存储数据的bundle,但是数据的存储操作到底是?
recently supplied in {@link #onSaveInstanceState}. 这句已经给我们指明了在onSaveInstanceState方法里存储数据此方法有一个参数bundle对象,我们可以实现该方法存储数据,
当存储数据后我们返回一个已经被销毁的界面的时候,可以在onCreate方法里取出数据复现(注意判断是否为空)
一个横竖屏的操作
当用户进行横竖屏切换的时候,我们期望的是状态保存:
在android中一个横竖屏的切换往往是一个新的界面打开,可以像系统内存不足异常销毁界面处理一样,
skip:
1 bundle对象只能存储基本的数据类型和实现Parcelable和Serializable的对象
2 用户操作或者程序控制销毁一个界面,界面状态记录会被完全清除
3 如何来模拟系统内存不做异常销毁界面的情况-= 设置—开发者选项—用户离开后立即清除每个活动(Don`t keep activities)