ActivityStart
极简:桌面本身就是一个常驻的App,点击桌面图标的时候,其实也是一个正常的App唤起另一个App的过程;
那么首先处理点击事件,然后走到Activity.startActivity(),这一步会通过Instrument调用AIDL接口,AMS服务先发一个pause事务给调用方Activity,于是当前Activity的ActivityThread收到pause事务后调用自身的performPauseActivity,当前Activity进入暂停状态。
然后就是启动新App的流程,首先Zygote进程fork自身(fork所以会有runtime),之后在新进程中执行ActivityThread(App的执行入口),ActivityThead就是一个常见的Java Main类一样,走到其main(String[] args)入口方法,其中包括: 1. 调用Looper.prepareMainLooper进行主线程looper初始化; 2. ActivityThead.acttach()进行Application初始化; 3. Loop.loop()进入消息循环
进程初始化完成并且主线程进入了循环,接下来就是往消息循环中提交Launch事务进行perforLaunchActivity初始化Activity,其中包括(顺序):1. attach()初始化Window,并为其设置WindowManager; 2. onCreate()初始化DecorView并inflate布局添加到DecorView; 3. OnResume()中调用Window.addView,创建ViewRootImpl并调用其setView,setView中执行了reqeustLayout。
Activity的Window初始化并添加了DecorView后,setView意味着在OnResume执行完成后的下一个handler消息就是渲染页面了,也就是通过 渲染时通过编舞者,先post一个同步消息屏障到主线程消息循环中并注册Vsyn回调的异步消息,意在阻拦所有同步消息执行,继而使渲染的message优先执行,在屏幕发出Vsync之后,回调到编舞者中开始执行输入、动画、Traversal,其中Traversal会移除同步消息屏障后开始执行view的测量、布局、渲染。