异常情况下Activity生命周期分析

来源:互联网 发布:wireshark过滤端口抓包 编辑:程序博客网 时间:2024/04/25 13:52

异常情况下Activity生命周期的分析

情景1:屏幕旋转导致Activity被杀死并重新创建

【在默认的情况下,当我们旋转屏幕的时候,系统杀死我们的Activity,并创建一个新的。(我们也可以在Manifest文件中配置Activity不用被杀死重建);】

一、过程分析:
1. Activity会调用onSaveInstanceState来保存一些数据:作为程序员的我们,就可以通过重写这个方法,来自定义保存一些我们需要在Activity被杀死的时候保存的数据;
2. 系统会自动会为View层次做保存和恢复工作:通过View的源码可以发现,每个View的子类都有onSaveInstanceState和onRestoreInstanceState方法,用来自动的为用户保存一些视图数据,比如ListView当前滑动了哪,EditText中输入的内容等等;
3. 新创建的Activity中onCreate和onRestoreInstanceState会将之前保存的数据以Bundle形式传入
1. onCreate中处理:需要判断Bundle对象是否为空;
2. onRestoreInstanceState中处理:无须判断Bundle为空,只要执行,这个传入的Bundle对象,一定就是有数据的。

二、设置系统不在屏幕旋转时重新创建Activity:
【Manifest.xml中配置参数:android:configChange=”orientation|…”】

首先让我们熟悉android:configChange参数列表:

  1. mcc:SIM卡唯一的国家代码,中国为460
  2. mnc:SIM卡的运营商代码唯一标识
  3. locale:本地位置发生了改变,一般指切换了语言
  4. touchscreen:可以忽略
  5. keyboard:键盘类型发生了改变,一般指用户使用了外接键盘
  6. keyboardHidden:键盘的可访问性发生了改变,比如用户调出了键盘
  7. navigation:可以忽略
  8. screenLayout:屏幕布局发生了改变,比如用户激活了另外一个显示设备
  9. fontScale:系统字体缩放比例发生了改变,比如用户选择了一个新的字号
  10. uiMode:用户界面模式发生了改变,比如切换了夜间模式 api8添加
  11. orientation:屏幕的方向,这个最常用
  12. screenSize:api13添加,屏幕的尺寸信息发生改变,比如旋转屏幕的时候,屏幕尺寸发生改变
  13. smallestScrrenSize:api13添加 ,设备的物理尺寸法伤了改变,比如切换了外接设备,这个和上面的screensize一样,都是在13才开始添加的
  14. layoutDirection:api17添加,布局方向发生变化的时候

设置了上面的configChange参数之后,虽然Activity不会执行重新创建,但是我们依然可以通过监听Actvity中的onConfigChanged方法,在上面特定属性改变的时候做一些自己想做的事情。

三、本人亲自测试Log日志展示:
正常启动一个Activity的生命周期:
这里写图片描述
未配置configchange属性旋转屏幕时候:
这里写图片描述
配置configchange属性时:我自己测试了一下,当配置了orientation和screenSize属性之后,Activity即不会再重新创建
这里写图片描述

四、提醒:
我在一开始编写测试demo的时候,一不小心用了下面代码,结果发现旋转屏幕时,代码根本不执行想要的保存操作:

 @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {  super.onSaveInstanceState(outState, outPersistentState);  Log.e("GU", "===onSaveInstanceState===");  outState.putString("data", "this a data from onSaveInstanceState save"); }

后来参阅了网上大神的博客:http://blog.csdn.net/lincyang/article/details/45287599才发现原来自己调用错了方法,我上面引用的方法是api21之后新加的属性,这个属性使activity有了持久化的能力。

情景2:资源内存不足导致低优先级的Activity被杀死

过程分析:【同情景1】;
Activity优先级概念:

  1. 高:前台Activity
  2. 中:可见但非前台Activity
  3. 低:后台Activity
  4. 由Android的这种机制可以给我们一些建议,我们不应该将一些后台操作脱离四大组建而运行,那样很容易被系统无意杀死,这里推荐最好将后台操作放在一个Service中进行,这样可以保证进程有一定的优先级,不会轻易被杀死。
1 0
原创粉丝点击