android GUI 流程记录
ViewRootImpl 与 wms


ViewRootImple里的 WindowSeesion是WindowManagerService的proxy, 通过这个句柄来调用WMS的功能
而W是 wms用来控制app window的句柄, 比如dispatch各种事件,focus,move,resize等, 都是由wms控制w来完成
android 按键触屏分发大致的流程:
· WMS所在的SystemServer进程接收到按键事件。
· WMS找到UI位于屏幕顶端的进程所对应的IWindow对象,这是一个Bp端对象。
· 调用这个IWindow对象的dispatchKey。IWindow对象的Bn端位于ViewRoot中,ViewRoot再根据内部View的位置信息找到真正处理这个事件的View,最后调用dispatchKey函数完成按键的处理。
activity resume时:
ViewRootImpl:
setView()->:
(1)mView = view; //decorView
(2)requestLayout();
(3)mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes, //mWindow 即W, 把W句柄给wms
getHostVisibility(), mDisplay.getDisplayId(),
mAttachInfo.mContentInsets, mInputChannel);
requestLayout()->scheduleTraversals()->TraversalRunnable::doTraversal()->performTraversals():
(1)relayoutResult = relayoutWindow(params, viewVisibility, insetsPending);
int relayoutResult = mWindowSession.relayout(
mWindow, mSeq, params,
(int) (mView.getMeasuredWidth() * appScale + 0.5f),
(int) (mView.getMeasuredHeight() * appScale + 0.5f),
viewVisibility, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0,
mWinFrame, mPendingOverscanInsets, mPendingContentInsets, mPendingVisibleInsets,
mPendingConfiguration, mSurface);
|
Binder
|
WindowManagerService:
relayoutWindow()->:
...
//在wms进程中创建surface并且拷贝到app进程中去
//createSurfaceLocked() --JNI--> nativeCreate, nativeSetXXX 等在c++层实现 -> SurfaceComposerClient::createSurface
①SurfaceControl surfaceControl = winAnimator.createSurfaceLocked();
-> new SurfaceControl() --JNI--> nativeCreate() -> SurfaceComposerClient::createSurface ->
②if (surfaceControl != null) {
outSurface.copyFrom(surfaceControl); //把surface对象从wms进程拷贝到app进程, java层的surface对象都只是对native对象的封装,包含一个native surface的指针
if (SHOW_TRANSACTIONS) Slog.i(TAG,
" OUT SURFACE " + outSurface + ": copied");
} else {
// For some reason there isn't a surface. Clear the
// caller's object so they see the same state.
outSurface.release();
}
...
(2)performMeasure()->mView.measure(childWidthMeasureSpec, childHeightMeasureSpec); //测量长宽
(3)performLayout()->host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight()); //确定位置
(4)performDraw()->draw(fullRedrawNeeded) //画图
①Surface surface = mSurface;
...
②drawSoftware(surface, attachInfo, yoff, scalingRequired, dirty))
canvas = mSurface.lockCanvas(dirty);
...
mView.draw(canvas);
...
surface.unlockCanvasAndPost(canvas);
android GUI 流程记录的更多相关文章
- android 启动流程 相关 杂项记录
Android原生流程 Init进程 主要流程及分支梳理 ueventd_main()watchdogd_main()主要流程a) 公共部分 增加PATH 环境变量初始化内核日志,打开/dev/kms ...
- 图解Android - Android GUI 系统 (1) - 概论
Android的GUI系统是Android最重要也最复杂的系统之一.它包括以下部分: 窗口和图形系统 - Window and View Manager System. 显示合成系统 - Surfac ...
- android Gui系统之SurfaceFlinger(1)---SurfaceFlinger概论
GUI 是任何系统都很重要的一块. android GUI大体分为4大块. 1)SurfaceFlinger 2)WMS 3)View机制 4)InputMethod 这块内容非常之多,但是理解后,可 ...
- Android GUI系统
图解Android - Android GUI 系统 (1) - 概论 图解Android - Android GUI 系统 (2) - 窗口管理系统 图解Android - Android GUI ...
- 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)
Android 的窗口管理系统 (View, Canvas, WindowManager) 在图解Android - Zygote 和 System Server 启动分析一 文里,我们已经知道And ...
- 图解Android - Android GUI 系统 (5) - Android的Event Input System
Android的用户输入处理 Android的用户输入系统获取用户按键(或模拟按键)输入,分发给特定的模块(Framework或应用程序)进行处理,它涉及到以下一些模块: Input Reader: ...
- Android绘制流程
一.前言 1.1.C++界面库 MFC.WTL.DuiLib.QT.Skia.OpenGL.Android里面的画图分为2D和3D两种: 2D是由Skia 来实现的,3D部分是由OpenGL实现的. ...
- android Gui系统之SurfaceFlinger(1)---SurfaceFlinger概论【转】
转自:https://www.cnblogs.com/deman/p/5584198.html 阅读目录 1.OpenGL & OpenGL ES 2.Android的硬件接口HAL 3.An ...
- Android系统启动流程(一)解析init进程启动过程
整体流程大致如下: 1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.in ...
随机推荐
- idea报错:Error:java不支持发行版本5的解决方法
将以下对应配置一致即可. File-->Project Structure File-->Settings
- Http请求中的Content-Type
转载至:https://segmentfault.com/a/1190000013056786?utm_source=tag-newest 一 前言 ----现在搞前端的不学好http有关的知识已经不 ...
- docker启动redis设置密码
docker run --name picker-redis -p 6379:6379 -d redis --requirepass "认证密码"
- 操作系统实验 windows编程多线程 生产者消费者问题 画圆画方(内置bug版)
实验3:随便写的 #include <windows.h> #include <string> #include <stdio.h> #pragma warning ...
- CSP-S 2019 Day 2 T3 树的重心
CSP-S 2019 Day 2 T3 树的重心 题 给出了一个大小为\(n\)的树,树中结点从 1∼n 编号.小简单的课后作业是求出这棵树单独删去每条边后,分裂出的两个子树的重心编号和之和. \(n ...
- 安装office2016时弹出microsoft setup bootstrapper已停止工作的解决办法
安装office2016时安装进度条走到最后又回滚,弹出microsoft setup bootstrapper已停止工作,最后“安装出错” 经过了1天的试尽了各种控制面板卸载.文件夹删除.offic ...
- alter table 修改表结构规范
use database_name; ) )), ADD INDEX index_time ( `timeId` ); # 添加主键: alter table table_name add prima ...
- hdu 2586 (lca-RMQ)
#include <iostream> #include <cstdlib> #include <cstring> #include <queue> # ...
- 玩转 Django2.0 笔记1
模板静态 路由 urls.py urlpatterns = [ path("<year>/<int:month>/<slug:day>",my ...
- MySQL语句错误及解决方案
1.group by查询错误 ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contai ...