Activity的生命周期/启动模式/过滤规则

Activity的生命周期/启动模式/过滤规则

1.1 Activity 的生命周期

1.1.1 典型情况下的生命周期分析

  • onCreate:该阶段可以做一些初始化工作:加载布局资源(setContentView)、初始化所需数据等。

  • onRestart:Activity重新启动

  • onStart:Activity正在启动,即将开始。Activity已经显示了,但是我们还看不到,不能交互。

  • onResume:Activity可见,能交互。

  • onPause:Activity正在停止。可以做一些不太耗时的操作:存储数据、停止动画等。(特殊情况下快速切换会从onPause->onResume,几乎不能重现。)

  • onStop:Activity即将停止。可以做一些稍微重量级的回收,但不能太耗时。

  • onDestroy:Activity即将销毁。做回收工作和最终的资源释放。

    Activity生命周期

  • Activity生命周期说明

    • 特定Activity第一次启动:onCreate->onStart->onResume。
    • 用户打开新Activity或返回桌面:onPause->onStop。若新Activity采用透明主题,当前Activity不会回调onStop。
    • 用户再次回到原Activity时:onRestart->onStart->onResume。
    • 用户back键回退:onPause->onStop->onDestroy。
  • (onStart和onStop)与(onResume和onPause)的区别

    • onStart和onStop是从Activity是否可见这个角度来回调的。
    • onResume和onPause是从Activity是都位于前台(交互与否)这个角度来回调的。
  • 当前Activity为A,新Activity为B;发生的生命周期调用顺序

    • A:onPause->B:onCreate->B:onStart->B:onResume->A:onStop
    • 所以不能在onPause里做耗时操作。应使新Activity尽快到前台。

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

  • 注意:1.1.2部分在新版本(测试API>28)时会有一定差异,差异参考1.1.3部分补充内容。

  • 1.资源相关的系统配置发生改变导致Activity被杀死并重新创建:(手机横竖屏切换)

    异常情况下Activity重建

    • onSaveInstanceState调用是在onStop之前,与onPause无时序关系。Activity周期正常的情况下不会调用该回调。onRestoreInstanceState调用是在onStart之后。
    • Activity重建是,系统会调用onRestoreInstanceState,将Activity销毁时onSaveInstanceState方法保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。(可通过onRestoreInstanceState和onCreate方法判断Activity是否被重建。)
  • 2.内存不足导致低优先级的Activity被杀死

    • 优先级:前台Activity>可见的非前台Activity>后台Activity。

    • 当系统内存不足时,系统会按照优先级从低到高杀死进程,后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。如果进程中无四大组件会很快被系统杀死,所以后台程序不适合脱离四大组件独自运行在后台,最好的方式是放在Service中,从而保证进程有一定的优先级,不会轻易被系统杀死。

    • 如果不希望Activity在屏幕横竖切换是被重建,可以指定configChange属性:

      <!--可以使用'|'符号连接-->
      android:configChanges="orientation|screenSize"
      

      注意:不会被重建不是被销毁;是不在通过保存状态->销毁->恢复状态这一流程;上述例子可能会导致不会根据屏幕横竖屏切换加载适合的资源文件(可能横屏竖时采用的是不同资源,hdpi<->xhdpi)。不重建情况下,系统会调用onConfigurationChanged方法。

    • configChanges项目及含义

      项目 含义
      mcc SIM卡唯一标识IMSI ( 国际移动用户识别码)中的国家代码,由三位数字组成,中国为460。
      mnc SIM卡唯-标识IMSI (国际移动用户识别码)中的运营商代码,由两位数字组成,中国移动TD系统为00,中国联通为01,中国电信为03。
      locale 设备的本地位置发生了改变,一般指切换了系统语言
      keyboard 键盘类型发生了改变,比如用户使用了外插键盘
      touchscreen 触摸屏发生了改变。
      keyboardHidden 键盘的可访问性发生了改变,比如用户调出了键盘。
      navigation 系统导航方式发生了改变,比如采用了轨迹球导航。
      screenLayout 屏幕布局发生了改变,很可能是用户激活了另外一个显示设备。
      fontScale 系统字体缩放比例发生了改变,比如用户选择了一个新字号。
      uiMode 用户界面模式发生了改变,比如是否开启了夜
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值