![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
android内核剖析结合源码
android内核剖析结合源码
惺惺作态
这个作者很懒,什么都没留下…
展开
-
Android应用程序的安装和显示过程
原创 2020-11-19 00:06:58 · 164 阅读 · 0 评论 -
addWindowToListlnOrdeLocked()的执行过程
addWindowToListln〇rdeLocked()的执行过程该 函 数 是 在 addWindow()中 被 调 用 的 , 其 作 用 是 将 新 建 的 WindowState对 象 添 加 到 mWindows列 表中 。 表 面 上 看 , 该 函 数 的 执 行 过 程 有 点 复 杂 , 但 其 执 行 的 目 的 就 是 当 添 加 新 建 的 窗 口 后 , mWindows列表 能 够 保 持 其 内 在 顺 序 上 的 固 有 规 则 , 因 此 , 如 果 按 照 这 种原创 2020-07-30 23:59:55 · 883 阅读 · 0 评论 -
删除窗口的时机
删除窗口的时机Android中 的 窗 口 和 Windows操 作 系 统 中 的 窗 口 管 理 有 一 个 明 显 差 别 ,就 是 窗 口 的 右 上 角 没 有 关 闭按 钮 , 即 用 户 不 能 直 接 关 闭 窗 口 。从 SD K 的 角 度 来 看 , SDK希 望 程 序 员 不 要 直 接 去 操 作 窗 口 , SD K 已 经 对 窗 口 进 行 了 各 种 封 装 ,Activity,菜 单 、 对 话 框 等 , 这 些 控 件 的 背 后 都 对 应 一 个 窗 口原创 2020-07-30 23:25:27 · 419 阅读 · 0 评论 -
assignLayersLockedO 的执行过程
assignLayersLocked() 的执行过程mWindows中 窗 口 的 排 列 顺 序 反 映 了 窗 口 应 该 被 层 叠 顺 序 , 而 assignLayersLocked()函 数 的 作 用 正 是根 据 mWindows自 身 的 顺 序 给 窗 口 的 mLayer进 行 赋 值 。 private final void assignLayersLocked() { int N = mWindows.size(); int curBaseLa原创 2020-07-30 22:14:28 · 266 阅读 · 0 评论 -
导 致 V iew 树重新遍历的总体诱因
导 致 V iew 树重新遍历的总体诱因下面介绍各种能引起View树重新遍历的操作,这些操作总的来讲可以分为三类。一类是导致视图大小发生变化;第 二 类是导致ViewGroup重新为子视图分配位置;第三类是视图显示情况发生变化需要 重 绘 。这 三 类 情 况 最 后 都 直 接 或 间 接 调 用 到 三 个 函 数 ,分 别 为 invalidateO、 requestLayoutO及requestFocus(),而这三个函数最终都会调用到ViewRoot中 的schueduleTraversa原创 2020-07-29 23:34:24 · 247 阅读 · 0 评论 -
V ie w 内默认消息派发过程
V ie w 内默认消息派发过程public boolean dispatchTouchEvent(MotionEvent event) { /** * 一 调 用 onFilterTouchEventForSecurity()处理窗口处于模糊显示状态下的消息。所谓的模糊显示是 * 指 ,应用程序可以设置当前窗口为模糊状态,此时窗口内部的所有视图将显示为模糊效果。这样做的目 * 的 是 为 了 隐 藏 窗 口 中 的 内 容 , 对 于原创 2020-07-29 23:31:17 · 191 阅读 · 0 评论 -
measure内部设计思路
host.measure()会 调 用 到View类 的 measure()函数,该函数然后回调onMeasure()。在一般情况下,host对象是一个ViewGroup实例,该ViewGroup会重载onMeasure(),当然如果host没有重载onMeasure(),则会执行View类中默认的onMeasureO。在一般情况下,程序员需要在重载的onMeaSure()函数中逐一对 所 包 含 的 子 视 图 执 行 measureO操 作 , 为 了 简 化 程 序 设 计 , ViewGrou原创 2020-07-29 22:35:47 · 156 阅读 · 0 评论 -
根视图内部(Activity)消息派发过程
首先来看mView.dispatchTouchEvent()的派发过程。该函数是在ViewRoot中调用的, mView的类型可能有两种情况,对于应用窗口而言, mView是一个PhoneWindow中的DecorView类型;对于非应用窗口而言, mView是一般的ViewGroup类型。在 DecorView中,首先判断是否存在Callback对象,它和按键消息派发时的Callback对象一样,就 是 Activity类 。 如 果 没 有 Callback对 象 , 则 直 接 调 用 Dee原创 2020-07-29 22:31:00 · 155 阅读 · 0 评论 -
触摸消息总体派发过程
** 和按键派发类似,当消息获取模块通过pipe将消息传递到客户端, InputQueue中的next()函数内部调 用 nativePollOnce()函数中会读取该消息。如果有消息,则 回 调ViewRoot内部的mlnputHandler对象的 dispatchMotion()函数,该函数仅仅是发起一个DISPATCH_POINTER异步消息,消息的处理函数是deliverPointerEvent()。执行完该函数后,调 用 finishInputEvent()向消息获取模块发送一个回执,以便原创 2020-07-29 22:13:15 · 147 阅读 · 0 评论 -
绘制滚动条
/** * <p>Request the drawing of the horizontal and the vertical scrollbar. The * scrollbars are painted only if they have been awakened first.</p> * * @param canvas the canvas on which to draw the scrollbars * * @原创 2020-07-29 17:40:43 · 458 阅读 · 0 评论 -
ViewGroup 类中 drawChild()过程
dmwChildO的核心过程是为子视图分配合适的Canvas剪切区,剪切区的大小取决于child的布局大小,剪切区的位置取决于child的内部滚动值及hild内部的当前动画。该函数内部的主体流程如图13-42所示,分为八大步。 protected boolean drawChild(Canvas canvas, View child, long drawingTime) { boolean more = false; final int cl = child.mLe原创 2020-07-28 22:54:46 · 567 阅读 · 2 评论 -
ViewGroup类 中 绘 制 子 视 图dispatchDraw()内部流程
/** * dispatchDraw()的作用是绘制父视图中包含的子视图,该函数的本质作用是给不同的子视图分配合 * 适 的 画 布 (Canvas),至于子视图如何绘制,则又递归到View类 的 draw()函数中。应用程序一般不需要 * 重 载 dispatchDrawO函数,而只需要在onLayout()中为子视图分配合适的大小, dispatchDraw()将根据前 * 面分配的大小调整Canvas的内部剪切区,并作为绘制子视图的画布。所有的ViewGro..原创 2020-07-28 22:41:04 · 1044 阅读 · 0 评论 -
View类中draw()函数内部流程
View类中draw()函数内部流程/**该函数的内部流程正如源码中的注释所讲.分为5步**/ public void draw(Canvas canvas) { if (ViewDebug.TRACE_HIERARCHY) { ViewDebug.trace(this, ViewDebug.HierarchyTraceType.DRAW); } final int privateFlags = mPri原创 2020-07-28 22:26:19 · 284 阅读 · 0 评论 -
ViewRoot的draw()分析
/** * ViewRoot中的draw()函数主要处理一些根视图中的特有属性,并且处理完毕后同样要调用View类 * 中 的draw()进行具体的绘制。 * Surface按照底层的驱动模式可以分为两种,一种是使用图形加速支持的Surface,俗称显卡,另一 * 种是使用CPU及内存模拟的Surface。因此,根视图中将针对不同的Surface采用不同的方式从该Surface * 中获取一个Canvas对象,并 将 该Canvas对象派发到整个视图...原创 2020-07-26 23:27:10 · 345 阅读 · 0 评论 -
View绘制元素
在介绍视图绘制之前,先来了解一下一个视图中都包含哪些需要绘制的元素,比如一个TextView,除了具体的文字外,还需要绘制文字的背景等。那么,视图中都包含哪些绘制元素呢?总的来讲,绘制元素包含四个,分别如下:View背景。每个视图都有一个背景,比 如 LinearLayout、 TextView,背景可以是一个颜色值,也可以是一幅图片,甚至可以是任何Drawable对象,比如一个Shader、一 个DrawableState等 。应用程序可以使用 setBackgroundColor()、 se原创 2020-07-26 23:25:07 · 141 阅读 · 0 评论 -
LinearLayout的onLayout()分析
/** * onLayout()函 数 中 首 先 根 据 mOrientation变 量 判 断 是 水 平 还 是 垂 直 ,如 果 是 垂 直 , 则调用 * layoutVertical()开始进行 layout 操作。 */ @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { if (mOrientation == VERTI.原创 2020-07-26 21:42:22 · 329 阅读 · 0 评论 -
布 局 (layout ) 过程
布 局 (layout ) 过程 public final void layout(int l, int t, int r, int b) { /** * 在 layout()函数中,首先调用setFrame()函数给当前视图设置参数中指定的位置,然后回调onLayoutO * 函数。 ViewGroup类中重载了 onLayout()函数,并且将其函数类型设置成了一个abstract类型,因此, * 所 有 的ViewGroup实例必原创 2020-07-26 21:29:20 · 446 阅读 · 0 评论 -
LinearLayout 中的 onMeasure()
LinearLayout 中的 onMeasure() /** * LinearLayout中 的onMeasure()函数内部,首先判断该LinearLayout是水 * 平的还是垂直的,并分别调用measureHorizontal()和 measureVertical(),下面仅分析垂直方向的measure * 过程。 */ @Override protected void onMeasure(int widthMeasureSpec, int原创 2020-07-26 21:17:02 · 290 阅读 · 0 评论 -
measure()源码分析
/*** host.measure()会 调 用 到View类 的 measure()函数,该函数然后回调onMeasure()。在一般情况下,* host对象是一个ViewGroup实例,该ViewGroup会重载onMeasure(),当然如果host没有重载onMeasure(),* 则会执行View类中默认的onMeasure()。在一般情况下,程序员需要在重载的onMeaSure()函数中逐一* 对 所 包 含 的 子 视 图 执 行 measureO操 作 , 为 了 简 化 程 序 设原创 2020-07-26 20:08:32 · 726 阅读 · 0 评论 -
performTraversals()
/** * performTraversals()函数正是系统内进行View树遍历工作的核心函数,该函数内部逻辑稍有复杂, * 一个函数代码长度约600行。虽然该函数的代码很长,但其主体逻辑却是很清晰的,其执行过程可简单 * 概括为根据之前所有设置好的状态,判断是否需要重新计算视图大小 measure)、是否需要重新安置视 * 图 的 位 置 layout),以及是否需要重绘 draw)视图, */ private void performTra..原创 2020-07-10 16:18:51 · 760 阅读 · 0 评论 -
requestLayout( )
该函数的执行过程比较简单,因为当View树进行重新布局时,总是重新给所有的视图进行布局,因为,最简单的想法就是只要设置一个标识就好了。* 首先给mPrivateFlags添 加 FORCE_LAYOUT标识,然后调用mParent的 requestLayoutO函数。对于 * 一个具体的View对象而言,其父视图要么是一个ViewGroup实例,要么是一个ViewRoot实例,而前 * 者并没有对该函数重载。也就是说,ViewGroup会按照基类 View )中的该函数进行处理,如果原创 2020-07-10 12:52:31 · 514 阅读 · 0 评论 -
invalidate()
该函数的作用是请求View树进行重绘,当应用程序需要重绘某个视图时,可以调用该函数。绘 制流程中,首先绘制最底层的根视图,然后再绘制其包含的子视图。子视图或者是一个VeiwGroup,或者是一个View,如果是ViewGroup的话,则继续再绘制ViewGroup内部的子视图,绘制过程一般并不会对所有视图进行重绘,而仅绘制那些“需要重绘” 的视图。那么,什么是“需要绘制”的视图呢?View类内部变量mPrivateFlags中包含了一个标志位DRAWN,当该视图需要绘制时,就给mPrivateFl原创 2020-07-10 12:42:52 · 889 阅读 · 0 评论 -
requestFocus(int direction, Rect preFocusRec)
和 invalidateO的调用有点相似,requestFocusO也是不能独自完成的,当一个视图想要获取焦点时,必须请求它的父视图完成该操作,为什么呢?因为父视图知道当前哪个视图正在拥有焦点,如果要进行焦点切换,则必须先告诉原先的视图放弃焦点,而这些操作所需要的信息是在父视图中保存的,所以requestFocus()也必须由父视图完成。该函数有如下三个不同的版本。• requestFocusO:无参数,它被转换成 requestFocus(View.FOCUS__DOWN)。• request原创 2020-07-10 10:09:26 · 1258 阅读 · 0 评论