Android Activity生命周期--应知应会
来源:互联网 发布:mac怎么用u盘重装系统 编辑:程序博客网 时间:2024/05/01 12:25
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状态的保存和恢复
- Android Activity生命周期--应知应会
- 【Android】【Activity生命周期】Activity生命周期
- Android activity的生命周期
- Android Activity 生命周期
- Android:Activity的生命周期
- Android 之 Activity 生命周期
- Android Activity生命周期
- android之activity生命周期
- Android Activity生命周期总结
- Android 之 Activity 生命周期
- Android Activity的生命周期
- Android Activity的生命周期
- android中的activity生命周期
- Android---Activity生命周期状态
- Android中Activity生命周期
- Android Activity的生命周期
- Android activity的生命周期
- Android---Activity生命周期状态
- 信源编码第二次作业
- QT多线程使用互斥体
- STM32 —— 多路DAC(输出电压和正弦波)
- keil中的printf函数显示结果
- 递归算法---全排列
- Android Activity生命周期--应知应会
- slua 1.3.1 vs2017 build file
- 记录下 刚开的博客
- 7.Draftjs 学习笔记-StateToHtml
- (java)leetcode-22
- JMeter proxy server
- Java学习笔记3--类与对象
- 特征选择
- Problem--131A--Codeforces--A. cAPS lOCK