让我们来探讨下关于Activity生命周期的那些事

相信每个学习android的童鞋接触到的关于android的第一个知识点就是Activity吧,因为activity在android里面实在是太重要了,对于用户来说,activity就是app的全部。如此重要的东西,不仔细揣摩探索下它怎么行。

这篇就来看看activity生命周期的那些事,也许有的童鞋会有疑问,那些基础老套的知识点还有什么探索的,不就是onCreate(),onStart()...那一套吗,但是,你确定你对activity的生命周期真的很熟悉?

我们来探讨一下以下一些问题和在一些场景下activity的生命周期:

(1)onResume,onPause()这一对和onStart(),onStop这一对生命周期近乎相同,这是不是接口重复了呢?他们的确很相像,但是是从不同角度定义的,onResume,onPause()是从activity是否在前台的角度来说的,onStart(),onStop是从activity是否可见的角度来说的,除此之外,在实际使用中几乎没有什么区别。

(2)activity A跳转到actvity B,A的生命周期为:onPause() → onStop(),B的生命周期为:onCreate() → onStart() → onResume(),这大家都知道,但是,A的生命周期有没有可能是别的情况呢?答案肯定是有的,如果B设置为透明主题,我们知道,当activity变为不可见时,会走onStop(),在这种情况下,虽然B覆盖在A上面,但A依然处于用户可见的状态,这时A的生命周期只会走onPause()

(3)由别的activity或桌面返回到activity A,A的生命周期为:onRestart() → onStart() → onResume(),如果从透明主题的activity返回的,那A的生命周期就为:onResume()

(4)假设当前activity为A,打开一个新的activity B,那么,将A与B的生命周期放在一条时间轴上看,是怎样的执行顺序呢?

A:onPause() → 
B:onCreate() → B:onStart() → B:onResume() → 
A:onStop()

所以,我们要尽量少在onPause()中做重量级操作,以保证新activity能以最快速度呈现在用户眼前。

(5)异常情况下的activity生命周期
比较典型的场景有:系统配置发生改变(本地语言变化,横竖屏切换,字体缩放比改变等),当然我们可以通过给activity指定android:configChanges来避免这种情况下的销毁重建,这时activity会回调onConfigurationChanged(Configuration newConfig);内存不足,处于后台的activity被销毁,这里有个activity优先级的概念,优先级从高到低依次为:处于前台的Activity → 处于后台但是可见的Activity → 处于后台的Activity。
Activity异常销毁时会调用onSaveInstanceState(Bundle outSate),系统会保存activity的一些信息,比如说view层次结构,activity会委托window保存信息,window又会委托他的上一级来保存,一般是DecorView,然后DecorView再让它的子元素来保存各自的信息,这种委托机制,在android其他方面的实现上我们也能看到,比如view的绘制,事件传递机制等。我们也可以在onSaveInstanceState(Bundle outSate)里面保存自己的信息,以便重建后恢复自己的一些状态。在重建activity时,activity会调onRestoreInstanceState(Bundle saveInstanceState),在里面,系统恢复activity信息,我们也能从saveInstanceState里面拿到之前保存的信息,在这需要提一下,只有activity发生重建了,onCreate(Bundle saveInstanceState)传过来的saveInstanceState参数才不为null,对其操作时应加判断。这些也许大家都知道,但是,有没有过这样一个疑问,onSaveInstanceStateonRestoreInstanceState都是在什么时机调用的呢?onSaveInstanceState (Bundle outSate)会在onStop()之前调用,与onPause()没有确定的时序关系。onRestoreInstanceState(Bundle saveInstanceState)则会在onStart()之后调用。

在我个人看来,熟悉activity生命周期最大的用处就在于:在恰当的时机做恰当的事。这样不仅能以最高效方式运行app,而且也避免了许多由操作时机导致的问题。

猜你喜欢

转载自blog.csdn.net/qq_15692039/article/details/80635144