深入学习activity之不同情况的生命周期
2016-06-19 14:08
141 查看
1.Activity的生命周期
1.典型情况的生命周期
oncreate()--> onStart()-->onresume -->onPause() -- >ononStop()-->Destory()
可以看出来,六个生命周期方法是前后对应的。
onStart()和onResume()区别在于onStart()还是在后台,前者不能交互,后者是在前台可以交互
onpause()可以做一些,数据保存,停止动画等工作但不能太耗时,影响activity的启动
onStop()可以做一些稍微重量级的回收工作,同样不能太耗时
onDestory()表示activity即将被销毁,这里可以进行资源回收
2.异常情况的生命周期
2.1资源相关的系统配置发生改变导致activity的重新创建
这里涉及到==系统资源的加载机制==(暂时不详解)。例如,系统根据不同的屏幕加载不同目录下的图片,或者,如果屏幕旋转就会自动加载横竖屏状态下的图片,如果不做设置,activity就会销毁然后重新创建。activity重建的生命周期会增加:onSaveInstanceState()和onReStoreInstanceState(),注意只有在异常终止时才会有这两个回调,正常的回退不会有。
onSaveInstanceState()在activity销毁时会保存当前activity的状态存入Bundle中,该回调是在onStop()之前,onPause()之前或之后。
onRestoreInstanceState()在重新创建时调用,Bundle保存了销毁时的状态,该回调在onStart()之后。也可以在onCreate()中判断该Bundle是否为null,得到是否是重新创建的activity。官方建议使用onRetoreInstanceStae()。
如果我们有一些重要的数据需要保存和恢复可以在这两个回调中进行。这两个回调系统会自动为activity保存和恢复一些状态,比如TextView的数据,listView的滚动位置。
具体的工作流程是:在OnSaveInstanceState()中activity委托window去保存数据,window委托顶层容器去保存数据,顶层容器一般是个Viewg或者DecorView,最后顶层容器通知子View去保存数据。层级委托。
View 中有onSaveInstanceState 和onRestoreInstanceState()方法,用于上述的调过程。
配置改变不想重新创建activity的方法
添加android:configChanges=“orientation|screenSize”//后一个是在sdk》13时需要加入的
属性可以指定屏幕方向改变时不重建activity。
配置改变的情况很多 ,常用的有locale(切换系统语言),orientation,keyboardHidden(键盘的显隐 ),ScreenSize,smallScreenSize。
不重新创建activity,不在回调上述两个回调函数,而调用了onConfigurationChanged()方法,可以在这里进行一些处理。
2.2 资源不足导致activity被杀死
这种情况activity的生命周期和上面系统配置改变情况一致。activity的优先级,优先级依次递减:
前台:处于交互的activity
可见但非前台:在弹出对话框之后的
后台:已经暂停的,如执行了onstop的
如果一个进程没有四大组件运行,那么很快就会被杀死。所以后台操作,应该使用service
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories