【Android API】startActivity流程分析

来源:互联网 发布:淘宝账号违规怎么解封 编辑:程序博客网 时间:2024/05/19 15:43

【难度系数★★☆☆☆】我们用startActivity()来开启一个Activity,那么从这个方法调用开始,到Activity的onCreate()方法中间发生了什么呢?理解了这个过程,有利于我们加深对Activity的理解,和相关bug的排查

  本文不贴出长篇的代码,只将其中的关键流程呈现出来,读者可自行对照源码来理解,源码的查看流程可以看我的这篇文章——如何查看Android源码

startActivity流程分析图

备注:
看不清图可以访问我的个人网站观看http://www.liyafeng.com/startActivity.html
其中ApplicationThread是ActivityThread的内部类

  从图中我们可以看到,从我们调用startActivity,到创建新的Activity,到调用新的Activity的onCreate()、onStart()、onRestoreInstanceState()、onResume()的整个过程,这就从原理上说明了Activity的生命周期为什么是这样的。
  我们也可以知道:

  • 原来Activity是通过反射new出来的,只不过是系统帮我们调用了一个个生命周期的方法
  • Application也是在这个时候通过反射new出来的,并且在Activity的onCreate()调用前调用了Application的onCreate(),当然这里的Application只创建一次,并被保存在android.app.LoadedApk这个类中,每次创建Activity的时候都会判断一下有没有Application,如果没有才会创建,所以Application的onCreate()只会在APP的第一个Activity启动前调用一次,所以我们可以在这里做一些全局初始化的工作
  • 原来一个Activity持有一个Window对象,这个Window是个抽象类,他的实现类是PhoneWindow,所以一个Activity持有的Window引用实际指向的对象是PhoneWindow,而这个PhoneWindow对象是图中调用attach()方法的时候new出来的
  • Activity、Application、Window对象创建完毕后,就开始调用Activity的onCreate、onStart、onResume方法
  • 在onResume方法调用后,调用了WindowManagerGloble的addview()添加decorview,然后里面root = new ViewRootImpl(),root.setView(decorview),这样ViewRootImpl就和DecorView建立起了联系,而ViewRootImpl是管理整个视图measure,layout,draw的地方
  • 最后才调用了Activity的makeVisible()方法,至此,Activity已经显示在屏幕上,所以,系统在调用每个生命周期方法的中间还是做了一些工作,我们可以根据不同的状态来将我们的业务逻辑放在合适的生命周期中
原创粉丝点击