Activity的生命周期
To live is to function,that is all there is in living.
任何Activity的生命周期都是给定的,Activity的生命周期设置的长短,关乎了整个程序的运行效果,一个良好的程序开发者对于Activity生命周期的把握绝对是极其准确的,所谓的生命周期指的是:一个Activity的开始时间,指导其结束的时间
Activity生命周期分为六个阶段:
1、created:Activity开始被创建
2、started:Activity开始启动
3、resumed:Activity显示在界面
4、paused:Activity被停止但是任然看得见,只是不能获取到焦点
5、stoped:Activity被结束消失在界面,不可见
6、destoryed:Activity被销毁,再回退栈中也找不到了,如果需要该activity需要重新创建
其中,详细流程如下
接下来看代码,我们在Activity里面重写这些方法,然后用log打印:
然后看logcat打印出什么:private static final String TAG = "---->>>"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG, "onCreate: "); } @Override protected void onStart() { super.onStart(); Log.i(TAG, "onStart: "); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "onResume: "); } @Override protected void onPause() { super.onPause(); Log.i(TAG, "onPause: "); } @Override protected void onStop() { super.onStop(); Log.i(TAG, "onStop: "); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "onDestroy: "); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "onRestart: "); }
可以发现在activity从无到有,出现在屏幕上,我们可见是会经历如下方法:
onCreate(加载视图)——>onStart(从后台调到前台)——>onResume(出现在屏幕上)
那么什么叫从后台调到前台尼?
我们将测试ActivityA跳转到ActivityB,再有ActivityB跳转至A,在打开会发现logcat会打印如下:
(此时的activity都是标准模式)
这个时候我们就需要谈一下回退栈了,回退栈可以看作一个堆栈,每当创建一个标准的Activity都会放入栈中,如果这个activity没有被销毁,并且没有获取焦点,这是便是它便后台,而前台就是正在显示的activity。
那么如果activity退出会执行什么方法尼,我们结合看logcat打印
可以发现activity从可见变为消失,执行了如下方法:
onPause()——>onStop( )——>onDestroy( )到此activity彻底没有了
那么如果Activity退出或者意外关闭会发生什么尼?
这时候由于activity已经消失了,并且退出了应用,所以它不仅会执行OnStop()还会执行OnDestroy(),销毁该Activity。
那么如果activity在可见的情况下,将切换其他应用会发生什么尼?
我们拭目以待
可以发现这个时候activity也彻底被干掉了
那么如果我们在activity可见的情况下将手机横竖切换又会发生什么尼?
可以发现,这个时候的activity销毁了,并且重新创建一个新的activity,那么如果之前的activity还有数据尼,如何保存这部分数据尼,这时候我们需要掌握一个新的技术,她的名字叫做“现场保护”,怎么做尼?如下:
/** * 当activity意外退出的时候会执行此方法 * 但是按返回键,属于正常逻辑行为 * 在onStop()与onDestroy()之间 * @param outState * */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("data","good good study"); Log.i(TAG, "onSaveInstanceState: "); } /** *当activity创建时调用 * 运行与onStart()与onResume()之间 * activity只要运行便会执行 * @param savedInstanceState */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); String data = savedInstanceState.getString("data"); Log.i(TAG, "onRestoreInstanceState: data = "+data); } }具体是什么我就不说了,代码注释的很详细,若仍有疑问请留言,我们再一次的执行横竖屏切换,接下来我们看logcat打印了什么:
成功的打印除了good good study,小伙伴们是不是学到了什么
总结:
在执行 onPause()方法时,界面可以看见,但是不能做任何操作,可以通过onResume()来再次得到界面,此时可以操作
在执行onStop()方法时,界面消失,完全不可见,但是可以通过onRestart()——onStart()——onResume()来将Activity显示在界面
用户在将竖屏切换至横屏的时候,其Activity的活动如下:onPause()—— onStop()—— onDestroy()—— onCreate()—— onStart( ) —— onResume()
如果不做现场保护,横竖屏切换过程中,会导致数据丢失,因为它开启的是一个新的Activity
此外,需要做优化的朋友有没有想过,在activity销毁的时候动动手脚尼 ;做动画的时候为了让系统识别自定义属性,在oncreate()的set Content View()这个里面动动手脚尼(Fratory加载视图)
此为个人陋见,若有误,还望读者海涵。配以官方图片,便于精确理解
一家之言,有误望扶正,多谢。