ActivityClientRecord 是apk进程中一个Activity的代表,这个对象的activity成员引用真正的Activity组件,一个Activity涉及到哪些对象呢?
- 1.Activity子类:应用实现的Activity实体
- 2.ContextImpl:接口就是我们非常熟悉的Context
- 3.PhoneWindow:接口是Window,这个对象可以理解为窗体的客户端,维护的是布局的xml文件,负责解析和加载控件
- 4.DecorView:顶层控件,应用创建的控件只是它的子控件
- 5.ViewRootImpl:这个对象可以理解为渲染引擎,负责渲染PhoneWindow中的控件到Surface上
- 6.Surface:窗体的显示载体
下面上个图大家看一下这六大护法和ActivityClientRecord之间的关系:
一个Activity的显示,在apk进程中基本分为三个步骤:一是解析xml文件加载控件,第二是请求一个系统窗体返回一个Surface,第三个步骤是将控件画到Surface上.
UI线程处理Activity生命周期的方法主要有六个,下面逐个分析:
handleLaunchActivity()方法
- 1.调用handleConfigurationChanged()更新资源配置
- 2.调用 WindowManagerGlobal::initialize()方法初始化全局窗口管理系统,每一apk进程一个WindowManagerGlobal对象
- 3.调用performLaunchActivity()拉起Activity
- 4.调用handleResumeActivity()唤醒Activity
第三步和第四步是核心,第四步下面会讲到,现在主要分析performLaunchActivity()这个方法:
- 1.加载Activity
- 2.创建Context
- 3.activity链接Context
- 4.调用Activity的onCreate()方法
performLaunchActivity()这个执行流程中onCreate()方法需要调用Activity::setContentView(),setContentView()负责设置xml文件到PhoneWindow,PhoneWindow负责解析加载控件树,这个方法执行完,Activity启动的第一步骤也就完成了。
handleResumeActivity()方法
- 1.调用performResumeActivity(),这个方法主要负责调用Activity的onResume()方法
- 2.添加控件到窗口管理系统:wm.addView()添加DecorView控件树,创建ViewRootImpl, ViewRootImpl 从窗口管理系统请求一个窗体,返回这个窗体的Surface,然后将控件树渲染到Surface上,提交窗口管理系统显示,这里有一点需要注意,渲染的过程是UI 的下一个事件,所以当下面的第三步上报的时候还没有画完呢
- 3.调用activityResumed()上报已经唤醒状态
handlePauseActivity()方法
- 1.回调Activity的onPause()方法
- 2.调用activityPaused()上报状态给AMS
handleStopActivity()方法
- 1.保存状态
- 2.回调Activity的onStop()方法
handleDestroyActivity()方法
- 1.回调Activity的onDestory()方法
- 2.清除上下文
- 3.调用activityDestroyed()上报状态给AMS
handleRelaunchActivity()方法
relaunch就是先销毁在启动,这个一个很暴力的方法,有没有数据可以复用,大家可以研究研究,对暴力的方法改为部分数据可以复用,就是一种对系统的优化,但是千万不要引入问题哟