31张图总结!一鼓作气学会“UI绘制流程详解(整体启动流程)”Android填坑之路

在android当中对于UI体系当中往往我们会在绘制UI的时候碰到各种各样的问题而不知道从何解决,也有时需要开发更改自定义组件时,需要做自己的调整,或者是实现某个自定义特效时的思路不明确,想要达到去玩转UI的最为基础的部分,就是去全面的深入了解UI的绘制流程.所以接下来带大家去进行全面分析UI整体的绘制体系.

android程序启动--->Activity加载并完成生命周期--->setContentView--->图形绘制

1.Android程序是如何启动,Activity生命周期如何调用?

2.在ActivityonCreate当中我们的setContentView是如何将UI文件加载?

3.UI是如何绘制的?

众所周知,我们的java程序想要开启需要依赖于main方法,也就是我们的程序入口(主线程)进入,但是在我们日常开发android程序的过程当中我们并没有发现main方法的存在,那么android当中的是如何开始运行的?

熟悉的朋友们可能都知道在android当中存在一个叫做ActivityThread的类,这个类代表的是android当中的主线程,而在这个类当中我们看到了比较熟悉的main方法,那么现在是否可以认为我们的android在打开app时是首先调用的是当前这个类的main,也就是此处为我们的启动点

在此处可以看到Activity调用了一个attach()方法

在这里我们可能首先要考虑的是getService拿出来的是什么?进去之后,我们会发现

在这个当中,里面调用了的系统的ActivityManagerService这个服务,并且给出了一个Binder接口

那么在这里,我们可以联想到,在android当中的binder通信机制,那么实际上我们的ActivityManager是有系统服务所调用管理,并且通过在binder接口当中进行调用,这也是为什么我们讲Activity是跨进程访问的原因

这时我们会看到一个scheduleLaunchActivity方法,表示计划加载时调用的。这里我门发现了一个很有意思的事情

这个上面我们会看到一个ActivityClientRecord对象,这个对象其实实际上就是我们的Activity,而且似乎每一个方法还干了一件让我们非常熟悉的一件事,进行了一次sendMessage()将当前创建的Activity发送了出去

当走到这里我们会发现最终我们调用的是Handler的消息通信机制,也就是说,在这里我们可以总结一下,当Activity状态改变时,都会有对应的一个消息发送出去。而接收这里,我能发现通过发送时不同的状态,这边调用了不同的handlerXXXActivity方法

在这里,我门貌似发现了Activity的生命周期的调用痕迹,那么其实到此为止,我门可以得出一个结论,Application运行的过程当中,对于Activity的操作,状态转变,其实实际上是通过Handler消息机制来完成的,Application当中只管去发,由消息机制负责调用,因为在main方法当中我门的Looper轮训器是一直在进行轮训的,而当我们在加载Activity的时候,当中调用了一个performLaunchActivity()方法,在这个中间我发现了我们onCreate的调用痕迹

在onCreate当中我们往往会使用setContentView去进行设置我们自己的布局文件或者view,那么在这当中他到底是怎么做的?通过观察源码,这个时候通过一系列线索我找到了最终的位置PhoneWindow类

这个时候我们会看到他做了两个事情,一个是installDecor,另一个是inflate,这两个后一个不难猜出他是在进行布局文件的解析,前面的我们认为她是在初始化某个东西

进来之后发现他初始化了两个东西,一个叫做mDecor,一个叫做mContentParent

我们看到了mDecor是一个DecorView,mContentParent是一个ViewGroup

透过注释的翻译,其实我们就能很明确知道这两个是用来干嘛的

//Thisistheviewinwhichthewindowcontentsareplaced.Itiseither(这是窗口内容放置的视图)//mDecoritself,orachildofmDecorwherethecontentsgo.(它要么是mDecor本身,要么是mDecor的子类的内容。)//Thisisthetop-levelviewofthewindow,containingthewindowdecor.(**这是在窗口当中的顶层View,包含窗口的decor**)一个代表的是顶层view,一个用来装他下面的视图内容。在接着往下看的时候,我门发现generateLayout方法当中,发现了在此处进行了大量的requestFeature的调用,也就是说,我们的requestFeature设置其实是在setContentView方法当中就开始了,这也是为什么我们自己要去getWindow.requestFeature时必须在setContent之前的原因

然后在下面我们会发现在做了一件事情

当前这里竟然在加载布局文件,并且生成了一个view,但是好像貌似不是我门自己的。所以我们需要去探寻他到底加载了一个什么东东?

这是我找到了一个比较有意思的组件,在这个上面我看到了一句这样的注释

//Thisisanoptimizedlayoutforascreen,withtheminimumsetoffeaturesenabled.这是一个屏幕的优化布局,具有最小的特征集启用。通过注释和一些资料分析,得到了一个比较坑的结果。

这是DecorView默认的一个渲染,然后我门自己的布局都是渲染到她的FrameLayout上的。那么在这里我门现在能够明白,installDector其实实际上是在初始化两个视图容器,然后加载系统的R资源及特征,产生了一个基本布局

这这段注释上面我门就可以得到一个信息

//Inflateanewviewhierarchyfromthespecifiedxmlresource.(从指定的视图当中获取试图的层次结构,意思就是,现在在加载自己的资源)而具体流程就不贴代码了给各位上一张图

那么在这里我门就能够明白,setContentView其实做了两件比较核心的事情,就是加载环境配置,和自己的布局,那么接下来我门需要考虑的事情就是,他到底怎么画到界面上的

通过前面两个章节,我门了解到,程序对于activity生命周期的调用,以及我们的视图资源的由来。这是我门需要找到的是我门的绘制起点在哪?

在ActivityThread启动时,我发现在加载handleLaunchActivity方法调用performLaunchActivity方法之后又调用了一个handleResumeActivity在这里我发现了绘制流程的开始

通过前面的流程我门知道,onCreate之行完成之后,所有资源交给WindowManager保管。在这里将我们的VIew交给了WindowManager,此处调用了addView

mViews保存的是View对象,DecorView

mRoots保存和顶层View关联的ViewRootImpl对象

mParams保存的是创建顶层View的layout参数。

而WindowManagerGlobal类也负责和WMS通信

而在此时,有一句关键代码root.setView,这里是将我们的参数,和视图同时交给了ViewRoot,那么这个时候我们来看下ViewRoot当中的setView干了什么

终于在这里让我发现了让我明白的一步

在这里我门会看到view.assignParent的设置是this,那么也就是说在view当中parent其实实际上是ViewRoot

那么在setContentView当中调用了一个setLayoutParams()是调用的ViewRoot的,而在ViewRoot当中发现了setLayoutParams和preformLayout对requestLayout方法的调用

在requestLayout当中发现了对scheduleTraversals方法的调用而scheduleTraversals当中调用了doTraversal的访问,最终访问到了performTraversals(),而在这个里面我发现了整体的绘制流程的调当前里面依次是用了

UI绘制先回去测量布局,然后在进行布局的摆放,当所有的布局测量摆放完毕之后,进行绘制。至此整体UI绘制过程我们就已经非常清楚了,我们可以根据这种绘制的流程来操作自己的自定义组件。

THE END
1.2024年长春中医药大学成人高考招生简章根据卫生部有关要求,医学类成人高等教育学历文凭将不能作为参加执业医师、执业护士考试的依据,考生要慎重填报志愿。 报考流程(签约保通过率) 第一步:到函授站进行报名确定报考院校和专业联系电话15500007357。 第二步:参加函授站组织的考前培训或领取复习资料做好应试准备。 http://www.jlscrgkw.com/crgk/2024-06-05/1763.html
2.intmain()作用详解起点和控制中心 程序的入口点: main 函数是程序的第一个被执行的函数。当程序启动时,控制权首先传递到 main 函数,从这里开始执行程序的逻辑。 控制中心: main 函数充当程序的控制中心,决定了程序的整体流程。在 main 函数中,你可以定义程序的初始化、主逻辑和清理等步骤。 https://developer.aliyun.com/article/1456808
1.新手写手签约秘籍:从开篇到爽点全攻略想要成为签约写手...新手写手签约秘籍:从开篇到爽点全攻略 想要成为签约写手?开篇至关重要! 编辑审稿时,会关注为什么你的作品好看,为什么不好。是因为开篇老套,还是代入感和主角人设不够吸引人? 记住,不符合编辑审核的作品不一定不行,但它可能不具备商业网文的资格。 开篇技巧: 情绪调动:让读者一开头就感受到...https://www.yoojia.com/article/4372369801617218209.html
2.起点怎么发表文章:小白也能轻松驾驭的投稿秘籍!起点原创小说投稿流程详解:避坑指南 发表文章,第一步当然是选定题材。想想看,你擅长写什么?言情?玄幻?都市?找到自己擅长的,才能写出好作品。 接下来就是动笔!写作过程中,注意文章的结构、人物设定以及剧情发展。一篇好的小说,不仅要有精彩的故事,还要有吸引人的文笔! https://www.shicehao.com/n202411121723076807bj.html
3.揭秘房间的秘密2起点第关:全面图文攻略及通关解密流程详解作为款集解谜探险逃脱元素于身的密室逃脱游戏,揭秘房间的秘密2吸引了众多玩家的关注。起点第关作为游戏的开端,虽然难度适中,但是隐藏的线索和谜题却让人捉摸不透。本文将为大家带来份全面图文攻略及通关解密流程详解,帮助大家顺利过关。 在起点第关中,玩家被锁在个神秘的房间内,需要通过寻找线索解开谜题,逐步了解这个...http://m.g-lotus.cn/gdt/13806.html
4.公路货物运输流程详解,从起点到终点的一切步骤解析公路货物运输的一般流程包括需求预测与计划制定、货源组织与管理、载具选择与运用、线路规划与调度、实际运输过程、到货卸载与交付、信息反馈与追踪以及费用结算与评价等多个环节,各环节相互关联,共同构成了一个完整的公路货物运输体系。https://www.cxwlhy.com/con4115.html
5.社会工作师证书怎么考取流程详解社会工作师在社会各界对于心理健康和社会服务愈发重视的当下,拥有专业背书的社会工作师逐渐成为紧缺人才。“社会工作师证书”,作为敲门砖,不仅是一份能力的认可,更是职业生涯的一大飞跃。那么如何有条不紊地取得这一证书?以下四部曲,将是您的指南针与地图。 选择起点:了解级别,找准定位 备考首当其冲的是明确方向,社工证书考试...https://www.youlu.com/shgzs/content/CB202410091756590000000011
6.2022年下半年图书借阅排行榜本书以马克思主义的内涵、创立与发展为起点,帮助同学总体上理解和把握什么是马克思主义和马克思主义基本原理,了解马克思主义产生的历史过程和发展阶段,掌握马克思主义的鲜明特征,深刻认识马克思主义的当代价值,增强学习和运用马克思主义的自觉性。本书作为学习辅导书,主要采用师生对话的形式,比较新颖,可以较好地辅导学生学习理...https://libx.czu.cn/2023/0105/c6377a120456/page.htm
7.原神调查点攻略:匪贼之窝探险流程详解,解锁隐藏任务完成技巧匪贼之窝探险流程详解 1. 起点与初步探索 匪贼之窝探险起点通常为个村庄或城镇附近,玩家首先需要到达指定地点,开始探险。初步探索过程中,需留意周围环境,寻找线索和可疑之处,可能会遭遇小规模的敌人,务必谨慎应对。 2. 深入探索与解锁隐藏区域 初步探索后,你会找到些线索,指引你深入匪贼之窝的核心区域。在深入探索...http://www.k2shilichunfeng.com/k2az/313.html
8.《狂战传说》龟人传攻略流程详解(一步步教你完成龟人传支线任务...在收集到所有的玉石后,我们需要返回任务起点将它们交给任务发起人。在这里,我们需要保持警惕,避免敌人的袭击。 十、与任务发起人对话 在完成任务后,我们需要与任务发起人进行对话,并领取奖励。在对话过程中,我们需要仔细了解奖励的种类和数量,并确定是否满足自己的需求。 https://www.waletao.com/article-21294-1.html
9.周村司机招聘最新动态,职业机遇的理想起点体育器材应聘流程详解 拓展阅读与建议 结束语 随着物流行业的快速发展,司机这一职业在周村地区也迎来了前所未有的发展机遇,本文将为您详细介绍周村地区最新的司机招聘消息,带您了解这一领域的职业前景、招聘条件、福利待遇以及应聘流程等关键信息,助您顺利找到理想的工作机会。 http://www.xydkj666.com/post/14337.html
10.原神攻略秘籍:揭秘容彩诗镜其的具体操作流程及细节详解助你顺利...具体操作流程 1. 起点与路线规划 任务起点通常位于某个特定的NPC处,玩家需首先找到该NPC接取任务。在接取任务后,玩家需根据任务提示,规划合适的路线,以便高效完成任务。 2. 诗镜获取 玩家需按照规划好的路线,前往指定地点获取诗镜。在获取过程中,可能会遇到敌人或陷阱,玩家需小心应对,避免战斗或陷阱影响任务进程。http://www.dabaiqiche.cn/dadt/3371.html
11.中韩(惠州)产业园起步区势如虹,已引进(签约)项目73宗2018年8月,市政府常务会议审议通过《中韩(惠州)产业园起步区建设方案》;2019年3月,起步区开始征地拆迁工作;2019年底,起步区陆续启动道路等基础设施建设;2020年初,第一宗产业项目正式进场动工……截至今年3月,起步区已引进(签约)项目73宗,计划总投资约528.2亿元,预计达产产值858.26亿元,达产产值10亿元及以上项目47宗,...https://static.nfapp.southcn.com/content/202103/30/c5030791.html
12.远方的梦想高中毕业的日本留学之旅四、日本留学申请流程详解 申请流程通常包括填写应用表格、提供成绩单及推荐信、高考成绩认证(对于中国学生来说)、提交语言考试成绩(如JLPT或TOEIC)等步骤。此外,还需要准备签证材料,如护照复印件、大一大二成績單原件、小说书籍证明文件等,以便于顺利完成签证手续。 https://www.eyyuy.com/liu-xue-yuan-xiao/4671.html
13.基于python的起点小说网源码mob64ca12eaf194的技术博客首先,我们来看一下整体的流程图,如下所示: 开始安装必要的库获取小说信息爬取小说内容保存小说内容结束 2.步骤详解 步骤1:安装必要的库 在开始之前,我们需要安装一些必要的Python库,来帮助我们实现基于起点小说网的源码。需要安装的库包括: requests:用于发送HTTP请求,获取网页内容。 https://blog.51cto.com/u_16213409/9358695
14.科目二考试最全流程详解想要顺利通过科目二考试,对于科目二考试的流程是必须要懂得的。以下是科目二考试最全流程详解,希望能帮助到你的学习! 科目二考试最全流程详解 一、侧方停车 场地介绍 起点位于坡起下坡后,车道扩展为两条,右侧实线区域为车位。考生需将车前行至停止线后,向右后方倒车进入车位,至与车道线平行且不超过底线停车,再向左...https://m.oh100.com/kaoshi/jiazhao/kemuer/345577.html
15.全面了解风控策略体系消费金融风控联盟产品驱动:区别于运营驱动。虽然都是为了商业利益,但获得利益的起点不同,产品驱动和运营驱动有一个很大的区别:前者技术型,后者业务型。 业务驱动:对业务的价值把握以及业务流程有一定的深入理解,并沉淀为行业经验。了解每个技术的亮点与应用场景,能熟练的通过这些工具去解决不同业务的问题,是每个技术型策略人员的终身目...https://www.shangyexinzhi.com/article/6849659.html
16.通知公告2010年普通高等学校应届毕业生入伍预征公告普通高等学校应届毕业生应征入伍流程 网上报名阶段:4月-6月,符合征集条件的学生登录大学生网上预征报名系统,进行预征网上报名。 初检初审阶段:6月底前,网报通过的学生参加当地县级兵役机关会同高校组织的政治初审和身体初检,合格的确定为预征对象。 复审应征阶段:10月底前,确定为预征对象的学生到生源地县兵役机关报名应...https://wxy.hbu.cn/info/1044/1784.htm
17.城市酷选:让每一次排队都成为财富积累的起点城市酷选:让每一次排队都成为财富积累的起点城市酷选:让每一次排队都成为财富积累的起点城市酷选:让每一次排队都成为财富积累的起点城市酷选:让每一次排队都成为财富积累的起点城市酷选:让每一次排队都成为财富积累的起点城市酷选:让每一次排队都成为财富积累的起点在当今的消费时代,各种创新型的商业模式层出不穷,其...http://176800999.b2b.11467.com/news/9158420.asp
18.游戏寻路之射线探测详解射线检测算法算法流程详解 算法开始的时候,起点S所在的多边形为“初始多边形”,以该多边形作为第一次算法的“迭代多边形”。 遍历“迭代多边形”的所有边,分别计算每一条边的与“目标射线”的交点情况。 上述计算后,会得到射线SN与当前多边形最多两个交点,而沿着射线方向,进入多边形的那条交点所在的边称为“传入边”,另一条边...https://blog.csdn.net/romantic_jie/article/details/114320590