Android View体系(2)
View 在WMS中注册窗口
当ViewRootimpl构造的时候,它需要建立与WMS通信的双向通道,分别是:
ViewRootImpl->WMS:IWindosSession;
WMS->ViewRootImpl:IWindow;
public ViewRootImpl(Context context, Display display) {mContext = context;mWindowSession = WindowManagerGlobal.getWindowSession();....
WindowManagerGlobal.java
public static IWindowSession getWindowSession() {synchronized (WindowManagerGlobal.class) {if (sWindowSession == null) {try {InputMethodManager imm = InputMethodManager.getInstance();IWindowManager windowManager = getWindowManagerService();sWindowSession = windowManager.openSession(new IWindowSessionCallback.Stub() {@Overridepublic void onAnimatorScaleChanged(float scale) {ValueAnimator.setDurationScale(scale);}},imm.getClient(), imm.getInputContext());} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}return sWindowSession;}}
public static IWindowManager getWindowManagerService() {synchronized (WindowManagerGlobal.class) {if (sWindowManagerService == null) {sWindowManagerService = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));try {if (sWindowManagerService != null) {ValueAnimator.setDurationScale(sWindowManagerService.getCurrentAnimatorScale());}} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}return sWindowManagerService;}}
接着ViewRootImpl执行setView,该函数会把DecorView(View树的根)设置到ViewRootImpl中,另一方面会向WMS申请注册一个窗口,同时将ViewRootImpl中的W对象作为参数传递给WMS
在setView()方法中,通过IWindowSession提供的addToDisplay(这个函数将调用WMS的addView),向WMS申请注册一个窗口。
res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,getHostVisibility(), mDisplay.getDisplayId(), mWinFrame,mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,mAttachInfo.mOutsets, mAttachInfo.mDisplayCutout, mInputChannel);
ViewRoot的基本工作方式
触发View更新操作源有两种:
1、内部:调用invalidate、requestlayout。这些请求会沿着View Tree层层往上传递,最终到达ViewRoot 这个View Tree的管理者在根据一系列时机情况来采取相应措施(比如是否发起一次遍历,是否需要通知WMS等)。
2、外部:触摸事件、按键事件、通知界面大小改变等。
ViewRoot内部定义了ViewRootHandler类来对这些消息进行统一处理。这个Handler实际上市和主线程的MessageQueue挂钩的。这也就是为什么不要在主线执行耗时操作的原因。
参考:
《深入理解Android内核设计思想》
Android View体系(2)相关推荐
- Android View体系(一)视图坐标系
http://blog.csdn.net/itachi85/article/details/50708391 前言 Android View体系是界面编程的核心,他的重要性不亚于Android四大组件 ...
- Android View体系(十)自定义组合控件
相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...
- Android View体系(五)从源码解析View的事件分发机制
Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Sc ...
- Android View体系(1)
Android View体系 Activity并没有与ViewRoot和View树有直接的联系,它含有一个Window对象 private Window mWindow; Window是一个抽象类,持 ...
- Android View体系‘铁三角‘
前言 在搞Android开发的时候,和View的交互是必不可免的,因为我们肉眼可见,可以控制操作最直观的也是View,因此很有必要来吹水一下整个View体系的'铁三角',既View 绘制流程,View ...
- Android View体系(六)从源码解析Activity的构成
前言 本来这篇是要讲View的工作流程的,View的工作流程主要指的measure.layout.draw这三大流程,在讲到这三大流程之前我们有必要要先了解下Activity的构成,所以就有了这篇文章 ...
- Android View体系(三)属性动画
上一篇文章讲了View滑动的六种方法,其中一种是使用动画,这篇文章我们来讲一讲动画的其中一种:属性动画. 1.android视图动画和属性动画 视图动画我们都了解,它提供了AlphaAnimation ...
- Android View体系(3)
View Tree的遍历时机 遍历ViewTree时机: 1.应用程序刚启动时: ViewRootImpl.java public void setView(View view, WindowMana ...
- Android View体系(4)
View Tree的遍历流程 遍历主体performTraversals UI显示三要素:尺寸大小.位置和内容,它们在遍历过程中分别对应以下函数: 尺寸大小:performMeasure()用于计算V ...
最新文章
- SD-WAN的体系结构是如何提高网络灵活性和效率?
- 前端如何让倒计时更准确
- 新数据革命:开源图形化数据引擎Hawk5发布
- 【css】CSS中折叠margin的问题
- 淘宝开发平台知识点一,入门指南
- JVM结构与OOM问题分析
- 视频监控安防平台-国标35114(GB35114)A级检测
- SSH端口修改端口号
- 【渝粤教育】电大中专门店销售与服务技巧 (3)作业 题库
- 从零搭建uniapp app,适合小白,傻瓜化,页面搭积木可视化创建
- python创建类的两个对象_Python为一个类创建多个对象
- Moses安装全记录
- dax和m的区别_动态股票K线图----从M语言到DAX表达式
- SpringBoot整合Elasticsearch,2021最新Java面试真题解析
- R语言3.6版本安装ggplot2报错解决方法
- SK海力士加入日韩美三国财团 收购东芝芯片业务
- 名人彩票Android客户端,名人彩票线路登录
- window python 读取路径问题
- Xsolla与GPay合作,全面开通土耳其市场
- html以及css基础知识