让我们来探讨下关于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
,对其操作时应加判断。这些也许大家都知道,但是,有没有过这样一个疑问,onSaveInstanceState
和onRestoreInstanceState
都是在什么时机调用的呢?onSaveInstanceState (Bundle outSate)
会在onStop()
之前调用,与onPause()
没有确定的时序关系。onRestoreInstanceState(Bundle saveInstanceState)
则会在onStart()
之后调用。
在我个人看来,熟悉activity生命周期最大的用处就在于:在恰当的时机做恰当的事。这样不仅能以最高效方式运行app,而且也避免了许多由操作时机导致的问题。