Android 深入分析Activity生命周期

Activity作为四大组件之一,是使用最为频繁的一种控件,日常开发中除了Window、Dialog和Toast之外,我们能见到的界面的确只有Activity。而Activity的生命周期作为基础中的基础就算入门级Android程序员也是耳熟能详。但是在很多特殊情况下生命周期是十分微妙的、

典型生命周期

所谓典型情况下的生命周期,是指在有用户参与的情况下,Activity所经过的生命周期的改变。正常一个Activity会经历以下的生命周期:

onCreat

表示正在被创建,这是很多空间生命周期的第一个方法,在这里我们可以做一些初始化工作,比如加载界面布局资源,初始化Activity所需的数据等。

onStart

表示正在被启动,即将开始,这时Activity已经可见了,但是还没有出现在前台,还无法与用户交互,这个时候可以理解成Activity已经显示出来了,但是我们看不到。

onResume

表示Activity已经处于前台并且开始活动,和onStart相比两者都其实都已经可见了,但是onStart时Activity还不在前台,不能与用户交互,onResume的时候Activity才显示到前台。

onPause

表示Activity正在停止,可以做一些轻量级的回收工作,如停止动画之类,不能太耗时会影响下个页面的进入速度,造成卡顿。正常情况下会紧接着调用onStop,在一些特殊情况下,如果这个时候快速地再回到当前Activity,那么onResume会直接被调用。

onStop

表示Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。

onDestroy

表示Activity即将被销毁,这里可以做一些回收工作和最终的资源释放。

存在的问题

onStart和onResume、onPause和onStop区别

这里引入焦点的概念,onStart和onStop表示Activity是否可见,而onResume和onPause是从是否获取焦点,这么说其实是比较抽象的。

例如我们在Activity上创建了一个Dialog,你会发现这时候会执行onPause,这就是因为此刻用户的焦点已经从Activity转移到了Dialog上面。

除此之外还有一种特殊情况,当Activity A跳转到另外一个Activity B时,正常执行的生命周期是onPause->onStop
但当Activity B采用透明主题时,那么Activity A就不会执行onStop,并且返回时也不会调用onStart

个人理解是因为目标透明,系统判定其已经是不可见了,所以当前Activity就不必进行进行隐藏和显示来配合目标Activity的生命周期。至于什么是透明主题相信用过类似SwipeBackActivity这类滑动返回的都知道这里就不多说了。

Activity跳转生命周期

  • 这个问题首先有个误区需要说明下,通常Activity跳转都是使用到startActivity()方法,所以理所应当的会觉得在调用该方法之后就会跳转到对应的Activity,实际上当然不会这么简单,这里涉及到的源码很复杂,涉及到Instrumentation、ActivityThread和ActivityManagerService。简单说下,就是当执行了startActivity()方法方法后并不会马上跳转到目标Activity并且执行其生命周期,而是会将当前Activity的创建生命周期完成之后才会跳转,从原理上分析也很好理解,Main线程只有一条,如果同时执行多个Activity的生命周期那不是就需要多条Main线程了吗(我是这么理解的,至于具体是不是并不确定)。
  • 然后就是我们的问题了,从Android源码可以得到一定的解释,在新Activity启动之前,栈顶的Activity需要先onPause后,新的Activity才能启动。最终在ActivityStackSupervisor中的realStartActivityLocked方法会调用ApplicationThread的scheduleLaunchActivity方法,最终由scheduleLaunchActivity方法完成新Activity的创建生命周期。
  • 因此可以得出结论,Activity跳转会经历以下的生命周期(这里用新旧来区分):旧onCreat-旧onStart-旧onResume-旧onPause-新onCreat…
总结
  • onStart和onStop代表Activity是否可见,onResume和onPause代表Activity是否在前台。

  • 在Activity切换时onStart和onStop有可能不会执行,onResume和onPause一定会执行。

  • 新Activity生命周期会在旧Activity的onPause执行之后开始执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值