Android Activity生命周期--应知应会
2017-04-06 23:35
113 查看
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状态的保存和恢复
相关文章推荐
- Activity的生命周期
- 《一个程序猿的生命周期》读后感
- Android 7.0分屏原理及生命周期
- request && session 生命周期
- activity 生命周期详解
- 《一个程序猿的生命周期》读后感
- 001jsp的基本知识-包括生命周期,怎么编译等等
- jsp、Servlet路径映射与生命周期
- Activity初级:Activity生命周期、service生命周期
- 读《人、绩效和职业道德》以及博客园博文《一个程序猿的生命周期》两篇文章有感
- Activity A 调到B 两者的生命周期(二)
- java线程生命周期
- ASP.NET页的生命周期
- iOS应用程序生命周期(前后台切换,应用的各种状态)详解
- iOS应用程序的生命周期
- Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务
- android Activity生命周期图解
- 项目的整个生命周期中的Project Server
- spring三种实例化Bean的方式和管理Bean的作用域和Bean的生命周期
- ASP.NET 应用程序(Application)生命周期概述