生命周期的管理,其实客户端和服务端来回调用,比如生命周期开启一个,就要暂停上一个,但这个同步是怎么做的,有待于研究。
ActivityRecord是系统AMS的activity记录表,每一个ActivityRecord对应一个Activity,本小节只要分析ActivityRecord数据和生命周期管理方法
realStartActivityLocked()方法
这个方法用来发送拉起Activity的命令给apk进程,对应的apk进程中处理的方法是handleLaunchActivity()
relaunchActivityLocked()方法
这个方法用来发送重新拉起Activity的命令给apk进程,对应的apk进程中处理的方法是handleReLaunchActivity()
startPausingLocked()方法
这个方法用来发送pause的命令Activity的命令给apk进程,对应的apk进程中处理的方法是handlePauseActivity()
stopActivityLocked()方法
这个方法用来发送stop的命令Activity的命令给apk进程,对应的apk进程中处理的方法是handleStopActivity()
destroyActivityLocked()方法
这个方法用来发送destory的命令Activity的命令给apk进程,对应的apk进程中处理的方法是handleDestroyActivity()
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