关于Activity生命周期的那些事

基本考点

配对法记忆Activity的生命周期方法

  • onCreate() ------ onDestroy()
  • onStart() ----  onRestart()  ----- onStop()
  • onResume() --- onPause() 
  • onSaveInstanceState() ------ onRestoreInstanceState()

用户行为会改变Activity的状态,由前后变化的状态可推断出中间执行了哪些回调方法

Activity的状态有:无(称实例不存在的状态为无)、运行状态、暂停状态、停止状态
  • 第一次启动应用的时候:无 ----> 运行状态(onCreate() ----> onStart() ----> onResume())
问题:onStart()和onResume()有何区别?
答:onCreate()是在渲染布局,onStart()是让该布局显示出来,onResume()是为了让该Activity得到焦点,可以和用户交互。

问题:

Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?

  • 按Home键、启动新的Activity时:运行状态 ----> 停止状态(onPause() ----> onStop())
  • 当用户重新又回到该Activity(点击后台任务栈或点击该应用的图标就可以回到该Activity)时:停止状态 ----> 运行状态(onRestart() ----> onStart() ----> onResume())
  • 此时当该Activity上弹出了对话框、启动了采用透明主题的新Activity:运行状态 ----> 暂停状态(onPause())
  • 对话框消失、又回到了该Activity上:暂停状态 ----> 运行状态(onResume())
  • 当用户按back键回退时,该Activity从任务栈中弹出:运行状态 ----> 无(onPause() ----> onStop() ----> onDestroy())

以上都是用户正常的操作触发的生命周期回调,属于典型情况

下面介绍一下在异常情况下所触发的生命周期回调

  • 情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建(例如假设activity属性配置那里已经设置允许可横竖屏切换)

手机屏幕旋转:运行状态 ----> 无 ----> 运行状态

onSaveInstanceState() ----> onPause() ----> onStop() ----> onDestroy() ----> onCreate() ----> onStart() ----> onRestoreInstanceState() ----> onResume())

或者

onPause() ----> onSaveInstanceState() ----> onStop() ----> onDestroy() ----> onCreate() ----> onStart() ----> onRestoreInstanceState() ----> onResume())

(当然我们可以阻止系统重新创建我们的Activity,以后会介绍到)

  • 情况2:资源内存不足导致低优先级的Activity被杀死(只有是在异常情况下onSaveInstance()和onRestoreInstanceState()放才会被调用)

首先我们弄情况优先级(降序):运行状态的Activity所在的进程 > 暂停状态的Activity所在的进程 > 停止状态的Activity所在的进程 > 没有四大组件支撑的后台进程

当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程(注意不是仅销毁一个Activity,而是整个应用进程)

  • 情况3:手机连接着电脑重新调试应用,会把原先在运行的进程杀死重启一个新的进程,这时Activity会重启(这不是用户行为,而是开发者行为)


onSaveInstanceState()方法会在Activity从可见状态变成不可见状态(即停止状态)时执行,但onRestoreInstanceState()只有在Activity重启(即Activity要经历过onDestroy()和接连着执行onCreate()方法)并且系统判断onCreate()方法里的onSavedInstanceState对象不为空时才会被执行。

其实,想要取出onSavedInstanceState对象里面的值并进行恢复,除了在onRestoreInstanceState()里执行该操作之外,还可以在onCreate()里执行,毕竟我们在onCreate()方法声明上就能清晰地看到onSavedInstanceState这个对象,不过一定要先判断其是否为空,否则会报空指针异常。

if (savedInstanceState!=null){
            String name = ""+savedInstanceState.get("name");
        }

奇葩问题

什么情况下Activity会回调onCreate()而不会回调onStart()?

答:在onCreate方法里调用finish()方法,这样就会直接回调onDestroy方法而不会走onStart流程。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值