Activity的生命周期和启动模式
生命周期有?
1.典型情况下的生命周期—》指有用户参与的情况下,Activity所经过的生命周期改变
2.异常情况下的生命周期—》指Activity被系统回收或者由于当前设备的configuration发生改变而导致Activity被销毁重建
1.1 典型生命周期分析
旧活动的OnPause先调用,新Activity才启动
异常分析:
1.资源相关的系统配置发生改变,导致Activity被杀死并重新创建
系统只在Activity导致终止的时候才会调用OnSaveInstanceState和OnRestoreInstanceState来存储和恢复数据,其他情况不会触发这个过程
2.资源内存不足导致低优先级的Activity被杀死
优先级: 前台Activity—> 可见非前台—> 后台Activity
Q:怎样在系统配置发生改变时,活动不被创建?
可配置configuration属性(在AndroidMenifest.xml中进行声明);如旋转屏幕时,configuration="orientation";
项目 | 含义 |
mcc |
SIM卡唯一标识IMSI(国际移动用户识别码)中的国家代码,有三位数字组成, 中国为460,此项标识mcc代码发生了改变 |
locale | 设备的本地位置发生了改变,一般指切换了系统语言 |
keyboardHidden | 键盘的可访问性发生了改变,比如用户调出了键盘 |
orientation | 屏幕方向发生了改变 |
touchscreen | 触摸屏发生了改变 |
keyboard | 键盘类型发生了改变,比如用户使用了外插键盘 |
navigation | 系统导航方式发生了改变,比如采用了轨迹球导航 |
screenLayout | 屏幕布局 |
fontScale | 系统字体缩放比例 |
uiMode | 用户界面模式发生了改变,比如是否开启了夜间模式 |
screenSize | 当屏幕的尺寸信息发生了改变,当旋转设备屏幕时,屏幕尺寸会发生变化 |
smallestScreeSize | 设备的物理屏幕尺寸发生改变,这个项目和屏幕的方向没有关系 |
LayoutDirection | 当布局方向发生变化 |
mnc | SIM卡唯一标识IMSI()中的运营商代码,由两个数字组成,移动00 联通 01 |
1.2 Activity启动模式
有哪些模式?
Standard:标准模式
SingleTop:栈顶复用模式
SingleTask:栈内复用模式
SingleInstance:单实例模式
Q:如何给Activity指定启动模式呢?
方法一: 通过AndroidMenifest.xml 为其指定;如android:launchMode="SingleTask";'
方法二:在Intent设置中设置; 如:intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
二者的区别如下:
1.二者同时存在时,以第二种为主;
2.前者不能设定 FLAG_ACTIVITY_CLEAR_TOP;后者不能为Activity 指定SingleInstance模式。
Activity的Falgs标志位
FLAG_ACTIVITY_NEW_TASK 为Activity指定“single Task” 启动模式
FLAG_ACTIVITY_SINGLE_TOP 为Activity指定“single Top”启动模式
FLAG_ACTIVITY_CLEAR_TOP 具有此标记位的Activity,当它启动时,在同一任务栈中,所有位于它上面的Activity都需要出栈
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 具有此标记的Activity,不会出现在历史 Activity的列表中
1.3 IntentFilter的匹配规则
一个Activity中可以有多个intent-filter ,一个Intent只要能匹配任何一组Intent-filter,即可启动对应的Activity
intent-filter 中过滤信息有 action、Category、 data、...
action: 匹配区分大小写(必须有一个,且和过滤规则中某个action相同)
只需要Intent中的action能够和过滤规则中的任何一个action匹配即可
Category:Intent中可以没有(系统会在加载startActivity/startActivityForResult时,匹配默认的category—DEFAULT),但若有,不管几个,每个都要能够和过滤规则中任何一个category相同;
data:必须含有data数据,且data数据能够安全匹配过滤规则中某个data
注:URI中schema 有默认值 content和file;
如果要为Intent指定完整的data,必须要调用setDataAndType 方法