Activity显示原理详情--View变成手机屏幕上的图片
2022-04-26 10:25:27 0 举报
Activity显示原理
作者其他创作
大纲/内容
//每一个ViewRootImpl对应一个WindowSession,在创建时候由WMS分配,ViewRootImpl可以通过它可以和WMS双向通信, mWindowSession.addToDisplay(...)通过Sesion中转最后调用WindowManagerService::addWindow(session..)这样通过Session wms就能获取之前已经渲染好的Surface,而且通过addWindow的传递过来的信息,可以安排这个Surface的层级,比如应用名可以获取当前是不是最前面的应用,然后把解析来要展示Surface按照层级发送给SurfaceFlinger
installDecor()初始化Activity的UI系统
Activity::onResume()
AMS推动生命周期流转
等待vsync信号
Activity::onCreate()setContentView(layoutResID)
至此完成了Activity显示体系的初始化和分工,Activity把表达显示内容的任务交给View体系,并且建立起Activity和View体系之间的双向通信。
mWindowSession.addToDisplay(...)
ActivityThread::handleResumeActivity(){}
通过LayoutInflater将用户自定义的xml转换为View,再将该View添加到DecorView中的子布局-contentParent中
1 、新建一个FrameLayout-DecorView,并设定它为Activity的根View-所谓的根veiw就是说Activity的所有显示内容都要放入这个DecorView内。 之后的显示就是Activity和系统协调各方神仙最终把DecorView包含的内容转换成像素点显示到屏幕上。2、 通过App和Activity设置的主题、style等特性来构建DecorView的布局,至少添加一个ActionBar和一个FrameLayout:com.android.internal.R.id.content,这个FrameLayout是用户自定义View的父布局-这里称它为contentParent。
ViewRootImpl::setView(View decorView...){ }
//检查当前线程是否是ViewRootImpl初始化进程->ViewRootImpl:checkThread() // 把绘制任务给安排上// 1、在ui线程插入一个同步消息屏障,这个消息屏障会阻塞消息屏障后面的同步消息执行// 2 、把我们的真正绘制任务performTraversals()交给Choreographer管理,Choreographer意思是编舞-具有协调智慧之意,会在收到vsync信号时候,通过异步消息的方式把真正的绘制任务插入ui线程,安排开始真正的绘制,同时接触同步消息屏障// 上面可以看出通过通过消息屏障机制,可以使UI线程在安排绘制任务-到真正执行绘制之前,不执行新的任务,给ui绘制分配了更多的UI线程时间,但是消息屏障之前的任务还是会执行,如果之前任务耗时,会影响绘制- >ViewRootImpl:scheduleTraversals();
Activity显示的本质是:把Activity要显示的内容转换成一组像素点(或者叫图片),然后把这组像素点放入到显示器缓冲区。 公众号:蚍蜉一生
SurfaceFlinger接收所有Surface,在Vsnc信号来的时候,把按照层级顺序排列的Surface合成最终的图片的输出到显示器
performResumeActivity()
requestLayout()
0 条评论
下一页