Activity生命周期

2018-04-27  本文已影响45人  蒸汽飞船
image.png

生命周期是一对一对的,每一对标记了Activity的一种状态区间
onCreate和onDestroy:存在期间
onStart和onStop:可见期间
onResume和onPause:前台期间

1.调用finish()方法后,走onstopondestroy,不会调用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是否会对生命周期产生影响

  1. 标准的AlertDialog
  2. 全屏的AlertDialog
  3. Dialog风格的Activity

结论:

  1. 无论是正常的dialog还是全屏的dialog,Activity状态无任何变化还在onResume()的状态,也就是说dialog并不会引起生命周期的变化。
  2. Dialog主题的Activity: 和A->B差不多,不过由于前面的Activity并没有完全不可见,所以并没有执行onStop,按后退键后,也是直接执行onResume而不经过onRestart以及onStart
  3. 一些透明主题的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界面视图也会自动调整方向,除此之外什么生命周期方法都不会走包括onSaveInstanceStateonRestoreInstanceState俩方法都不会。

onSaveInstanceState和onRestoreInstanceState数据保存

  1. 注意保存有俩方法onSaveInstanceState(Bundle outState)onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)要用前面那个,后面那个是API 21+添加的。

  2. onSaveInstanceState方法的调用时机是在onStop之前,与onPause没有固定的时序关系。而onRestoreInstanceState方法则是在onStart之后调用。

  3. 正常情况下的Activity销毁并不会调用这两个方法,只有当活动异常销毁并且有机会重新展示的时候才会进行调用,如1.旋转屏幕2.Activity因内存不足被销毁

  4. onRestoreInstanceStateonCreate都可以进行数据恢复工作,但是根据官方文档建议采用在onRestoreInstanceState中去恢复。

  5. onRestoreInstanceStateonRestoreInstanceState这两个方法中,系统会默认为我们进行一定的恢复工作,所有带id的view基本都会保存和恢复。

  6. 按电源键关屏时当前activity也会调用onSaveInstanceState,但再按电源键时不一定会调用onRestoreInstanceState

  7. 特例: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新添加
上一篇下一篇

猜你喜欢

热点阅读