Android笔记--View绘制流程源码分析二

通过上一篇View绘制流程源码分析一可以知晓整个绘制流程之前,在activity启动过程中:

Window的建立(activit.attach生成),DecorView的建立(phonewindow.setContentView生成),

两者利用ViewRootImpl(WindowManagerGlobal.addView生成)建立window和decorview的联系。

并在root.setView(view, wparams, panelParentView)中把viewrootimpl(其本身也是一个viewparent)

作为参数传给decorview.从而让decorview一脉的所有view受viewRootImpl管理绘制。

在知道了上述Window DecorView WindowManager ViewRootImpl的来龙去脉以后就可以继续分析View

绘制的流程。

那么到底是谁触发了绘制呢?从源码中可以找到如下静态内部类:

 static class W extends IWindow.Stub {

这个类就是负责处理来自系统进程的调用处理工作。在WMS中会触发相应的方法。而W中真正执行处理的

是ViewRootImpl。可以看一个其中的例子:

static class W extends IWindow.Stub {

。。。省略

    @Override
public void dispatchAppVisibility(boolean visible) {
final ViewRootImpl viewAncestor = mViewAncestor.get();
if (viewAncestor != null) {
viewAncestor.dispatchAppVisibility(visible);
}
}
。。。省略
}

W是在ViewRootImpl的构造函数中初始化的:

public ViewRootImpl(Context context, Display display) {
。。。省略
mWindow = new W(this);
}

所以这里的ViewRootImpl就是W中的ViewRootImpl对象。

从而系统进程远程触发绘制的流程:

viewAncestor.dispatchAppVisibility(visible);

这个就是ViewRootImpl的方法。最终会调用如下方法:

ViewRootImpl.java

public void dispatchAppVisibility(boolean visible) {
Message msg = mHandler.obtainMessage(MSG_DISPATCH_APP_VISIBILITY);
msg.arg1 = visible ? 1 : 0;
mHandler.sendMessage(msg);
}
//通过handler进行消息传递 void handleAppVisibility(boolean visible) {
if (mAppVisible != visible) {
mAppVisible = visible;
scheduleTraversals();
。。。省略
}
}

scheduleTraversals方法就是开始进行view绘制的入口方法

 void scheduleTraversals() {
if (!mTraversalScheduled) {
mTraversalScheduled = true;
mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
mChoreographer.postCallback(
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
//这里的mTraversalRunnable就是一个runnable接口。其run方法内部是view绘制的全过程 。。。省略
}
} void doTraversal() {
if (mTraversalScheduled) {
。。。省略 performTraversals(); 。。。。省略
}
}

执行到此为止performTraversals方法就是众所周知的真 | View绘制流程!

Android笔记--View绘制流程源码分析(二)的更多相关文章

  1. Android笔记--View绘制流程源码分析(一)

    Android笔记--View绘制流程源码分析 View绘制之前框架流程分析 View绘制的分析始终是离不开Activity及其内部的Window的.在Activity的源码启动流程中,一并包含 着A ...

  2. Android之View绘制流程源码分析

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 对于稍有自定义View经验的安卓开发者来说,onMeasure,onLayout,onDraw这三个方法都不会陌生,起码多少都有所接触吧. 在安卓中 ...

  3. Android开发——View绘制过程源码解析(二)

    0. 前言   View的绘制流程从ViewRoot的performTraversals开始,经过measure,layout,draw三个流程,之后就可以在屏幕上看到View了.上一篇已经介绍了Vi ...

  4. Android开发——View绘制过程源码解析(一)

    )UNSPECIFIED:表示View可以设置成任意的大小,没有任何限制.这种情况比较少见. 2. MeasureSpec的生成过程 2.1 顶级View的MeasureSpec // desired ...

  5. Android Touch事件派发流程源码分析

    分native侧事件派发到java侧和Framework派发事件到UI,流程看源码即可,此处不赘叙, Native侧派发事件的干活类图如下:

  6. scrapy 源码解析 (二):启动流程源码分析(二) CrawlerProcess主进程

    CrawlerProcess主进程 它控制了twisted的reactor,也就是整个事件循环.它负责配置reactor并启动事件循环,最后在所有爬取结束后停止reactor.另外还控制了一些信号操作 ...

  7. [Android]从Launcher开始启动App流程源码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5017056.html 从Launcher开始启动App流程源码 ...

  8. [Android]Android系统启动流程源码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5013863.html Android系统启动流程源码分析 首先 ...

  9. Spring加载流程源码分析03【refresh】

      前面两篇文章分析了super(this)和setConfigLocations(configLocations)的源代码,本文来分析下refresh的源码, Spring加载流程源码分析01[su ...

随机推荐

  1. KMP匹配 (1)

    ---恢复内容开始--- 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串" ...

  2. 安装pillow

    最近想学Python的图像操作.首要任务就是安装pillow.这个强大的图形处理工具. 但是我遇到了一个问题. Collecting pilow  Could not find a version t ...

  3. linux查询内存真是利用率

    使用top工具查看到Suse Linux的内存占用率很大,可能97%以上,我知道这是Linux的内存使用机制,先将内存整个管理起来,需要的时候在分配给单个进程.但是如果我需要查看系统真实的内存占用率应 ...

  4. sqlserver的语句和mysql语句

    感谢原创 sqlserver和mysql基本语句的对比 http://blog.csdn.net/kk185800961/article/details/47044751 sqlserver中常见的语 ...

  5. 小议Python3的原生协程机制

    此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在最近发布的 Python 3.5 版本中,官方正式引入了 async/await关键字.在 asyncio ...

  6. 模拟一则ORA-600 [4194][][]故障并处理

    环境:OEL 5.7 + Oracle 11.2.0.3 1.模拟ORA-600 [4194][][]故障 2.使用bbed处理 3.尝试启动数据库 1.模拟ORA-600 [4194][][]故障 ...

  7. jquery获取元素对应高度

    https://www.cnblogs.com/sntetwt/p/3823592.html 获取点击元素距离页面的高度 $(select).offset().top - $(document).sc ...

  8. 51nod 1086【背包·DP】

    思路: 如果体积乘以数量>=W,那么直接用完全背包模型.如果不到的话,用二进制优化就好了. 基础题,感觉这样写很优雅?回去睡觉. #include <bits/stdc++.h> u ...

  9. 洛谷P1722 矩阵 II(Catalan数)

    P1722 矩阵 II 题目背景 usqwedf 改编系列题. 题目描述 如果你在百忙之中抽空看题,请自动跳到第六行. 众所周知,在中国古代算筹中,红为正,黑为负…… 给定一个1*(2n)的矩阵(us ...

  10. GHOST操作

    通过详细的图文说明,怎么用ghost备份系统,以备系统中毒或者感觉不好用时,快速恢复到备份时的状态! 工具/原料 2013最新雨林木风ghostxpxp3系统或者老毛桃等工具 方法/步骤 1 重新启动 ...