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开发艺术探索》