Android Activity生命周期--应知应会

本文深入探讨Android中Activity的生命周期,包括不同回调方法的作用时机及其重要性。解释了onPause(), onStop() 和 onDestroy() 的调用条件,以及 onSaveInstanceState() 和 onRestoreInstanceState() 如何保存与恢复Activity状态。
摘要由CSDN通过智能技术生成

1. 摘要

        谷歌中国已经可以访问了,本博客主要依赖于https://developer.android.google.cn/reference/android/app/Activity.html[1]。除此之外,在看谷歌官网之前,不少Activity生命周期的知识,都来自于《Android开发艺术探索》[2]一书。这篇博客,也许一些知识及观点,借鉴于它。


2. Android生命周期



3. Activity何时被销毁?onPause() vs onStop() vs onDestroy()

        Android 3.0(HONEYCOMB API 11)之前,onPause()肯定会被调用,但onStop()和onDestroy()不一定会被调用。Android 3.0之后,onPause()肯定会被调用,onStop()也肯定会被调用,但onDestroy()有可能不会调用。(谷歌官网文档给出的标准,应该不会错的)


4. onSaveInstanceState(Bundle) onRestoreInstanceState(Bundle) 及 onCreate(Bundle)

        当Android系统认为Activity之后还会被使用,但现在不得不把它杀死,会调用onSaveInstanceState(Bundle)。比如,Activity回到后台;设置切换语言等。在Bundle中保存的参数,在onCreate(Bundle)和onRestoreInstanceState都可以取得。

        onSaveInstanceState(Bundle)将会在onStop()之前被调用,但Android系统不保证它是否是在onPause()还是之后被调用。虽然,实验的时候,每次都是在onPause()之后被调用。但谷歌文档这样说,实际产品中,不应认为onSaveInstanceState(Bundle)一定会在onPause()之后被调用。

        在onCreate(Bundle)中,当onSaveInstanceState(Bundle)未被调用时,经常会传一个Bundle为空值。所以,在实际的产品中,总是对Bundle进行空值检查。

        在onRestoreInstanceState(Bundle)被调用时,Bundle不会为空值,因为只有onSaveInstanceState(Bundle)被调用后,它才会被调用。onRestoreInstaceState(Bundle)会在onStart()和onPostCreate(Bundle)之间被调用。onPostCreate(Bundle)通常不会被应用开发者使用到。onPostCreate(Bundle)会在onResume()之前被调用。onRestoreInstanceState(Bundle)在onSaveInstanceState(Bundle)被调用之后,不一定会被调用的。

        这个图比较能说明问题[3]。



5. onSaveInstanceState(Bundle) vs onSaveInstanceState(Bundle, PersistableBundle)

        API 21(Android 5.0 Lollipop)中引入的。需要在Activity中设置persistable属性为persistAcrossReboots。

        <activity
            android:persistableMode="persistAcrossReboots"
            android:name=".MainActivity">
        </activity>
onSaveInstanceState(Bundle, PersistableBundle)对应的有onCreate(Bundle, PersistableBundle)和onRestoreInstanceState(Bundle, PersistableBundle)。

与之前不同的是,在实验中,onRestoreInstanceState的回调参数,有时会有null值。而且,onRestoreInstanceState(Bundle, PersistableBundle)

和onSaveInstanceState(Bundle, PersistableBundle)也不一定成对出现。


6. onConfigurationChanged(Configuration)

        在activity中设置该属性,可以避免一些Activity的重建,而改为回调onConfigurationChanged(Configuration)。

        <activity
            android:configChanges="orientation"
            android:name=".MainActivity">
        </activity>
        支持的属性有:orientation、fontScale、keyboard、keyboardHidden、layoutDirection、locale、navigation、screenLayout、touchscreen、uiMode、smallestScreenSize、density、screenSize。可以使用“|”进行组合。比如,"orientation|screenSize"可以避免横竖屏切换时,Activity进行重建,而调用onConfigurationChanged(Configuration)。


7. onLowMemory() and onTrimMemory(int)

        当Android系统内存不够时,会调用它们,以便于Activity在被销毁前,可以得到回调。onLowMemory()在API 1(Android 1.0)就已经存在,而onTrimMemory(int)是在API 14(Android 4.0 - 4.0.2 Ice Cream Sandwich)加入的。


8. 总结

        本文以Activity周期为起点和线索,介绍了一些Activity周期相关的重要知识。部分内容来源于谷歌官方文档;部分内容来源于作者的实践和积累;部分内容来源于其它书籍和博客。本文以Activity生命周期为主线,同时对其进行衍生。之后,有关Activity生命周期有关的知识,会对博客进行持续更新。


9. 引用

[1] https://developer.android.google.cn/reference/android/app/Activity.html

[2] 《Android开发艺术探索》

[3] android中Activity状态的保存和恢复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值