生命周期是一对一对的,每一对标记了Activity的一种状态区间
onCreate和onDestroy:存在期间
onStart和onStop:可见期间
onResume和onPause:前台期间
1.调用finish()
方法后,走onstop
和ondestroy
,不会调用onpause
2.onRestart其实和onstart是绑一起的 : 这两个方法代表了activity
由完全不可见重新变为可见的过程,即由onStop()
后返回,便会触发该回调链。
A->B
A:onPause
B:onCreate
B:onStart
B:onResume
A:onStop
返回:
B:onPause
A:onRestart
A:onStart
A:onResume
B:onStop
B:onDestroy
dialog是否会对生命周期产生影响
- 标准的AlertDialog
- 全屏的AlertDialog
- Dialog风格的Activity
结论:
- 无论是
正常的dialog还是全屏的dialog
,Activity状态无任何变化还在onResume()
的状态,也就是说dialog
并不会引起生命周期的变化。 -
Dialog主题的Activity
: 和A->B差不多,不过由于前面的Activity
并没有完全不可见,所以并没有执行onStop
,按后退键后,也是直接执行onResume
而不经过onRestart
以及onStart
。 - 一些透明主题的Activity、或者不能完全遮挡下层Activity的,效果也和2一样。
周期:
A:onPause
DA:onCreate
DA:onStart
DA:onResume
//没了
返回:
DA:onPause
A:onResume
DA:onStop
DA:onDestroy
旋转屏幕:
旋转屏幕,蓝色表示方法基本同时调用想不重新创建Activity配置属性:
android:configChanges="keyboardHidden|orientation|screenSize"
此时屏幕旋转不会重建Activity,只会回调
onConfigurationChanged
界面视图也会自动调整方向,除此之外什么生命周期方法都不会走包括onSaveInstanceState
和onRestoreInstanceState
俩方法都不会。
onSaveInstanceState和onRestoreInstanceState数据保存
-
注意保存有俩方法
onSaveInstanceState(Bundle outState)
和onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
要用前面那个,后面那个是API 21+添加的。 -
onSaveInstanceState
方法的调用时机是在onStop
之前,与onPause
没有固定的时序关系。而onRestoreInstanceState
方法则是在onStart
之后调用。 -
正常情况下的
Activity
销毁并不会调用这两个方法,只有当活动异常销毁
并且有机会重新展示
的时候才会进行调用,如1.旋转屏幕,2.Activity因内存不足被销毁 -
在
onRestoreInstanceState
和onCreate
都可以进行数据恢复工作,但是根据官方文档建议采用在onRestoreInstanceState
中去恢复。 -
在
onRestoreInstanceState
和onRestoreInstanceState
这两个方法中,系统会默认为我们进行一定的恢复工作,所有带id的view基本都会保存和恢复。 -
按电源键关屏时当前
activity
也会调用onSaveInstanceState
,但再按电源键时不一定会调用onRestoreInstanceState
。 -
特例:
TextView
:通过setText
方法动态设置文本内容,即使加了id也无法自动保存,这种情况可以通过给TextView
设置freezesText
属性才能自动保存,当然这条属性对EditText也同样适用。
singleTop(栈顶复用)模式下的生命周期:
onPause
onNewIntent
onResume
所有的ConfigChanges
属性值 | 含义 |
---|---|
mcc | SIM卡唯一标识IMSI(国际移动用户标识码)中的国家代码,由三位数字组成,中国为:460 这里标识mcc代码发生了改变 |
mnc | SIM卡唯一标识IMSI(国际移动用户标识码)中的运营商代码,有两位数字组成,中国移动TD系统为00,中国联通为01,电信为03,此项标识mnc发生了改变 |
locale | 设备的本地位置发生了改变,一般指的是切换了系统语言 |
touchscreen | 触摸屏发生了改变 |
keyboard | 键盘类型发生了改变,比如用户使用了外接键盘 |
keyboardHidden | 键盘的可访问性发生了改变,比如用户调出了键盘 |
navigation | 系统导航方式发生了改变 |
screenLayout | 屏幕布局发生了改变,很可能是用户激活了另外一个显示设备 |
fontScale | 系统字体缩放比例发生了改变,比如用户选择了个新的字号 |
uiMode | 用户界面模式发生了改变,比如开启夜间模式-API8新添加 |
orientation | 屏幕方向发生改变,比如旋转了手机屏幕 |
screenSize | 当屏幕尺寸信息发生改变(当编译选项中的minSdkVersion和targeSdkVersion均低于13时不会导致Activity重启)API13新添加 |
smallestScreenSize | 设备的物理屏幕尺寸发生改变,这个和屏幕方向没关系,比如切换到外部显示设备-API13新添加 |
layoutDirection | 当布局方向发生改变的时候,正常情况下无法修改布局的layoutDirection的属性-API17新添加 |
网友评论