ViewRoot是GUI管理系统与GUI呈现系统之间的桥梁,根据ViewRoot的定义,我们发现它并不是一个View类型,而是一个Handler。
它的主要作用如下:
A. 向DecorView分发收到的用户发起的event事件,如按键,触屏,轨迹球等事件;
B. 与WindowManagerService交互,完成整个Activity的GUI的绘制。
事件处理和GUI绘制的具体实现在后面的文章中再描述,这篇文章就主要介绍ViewRoot对象如何同WindowManagerService桥接起来的。
在完成Activity的ContentView设置之后,下面的工作就是准备显示了,准备显示的主要工作就是建立起Application和WindowManagerService之间的联系,第一步的工作就是向WindowManager添加前面涉及到的DecorView,我们已经知道这个DecorView包含了整个Activity的GUI,所以我们只需要把这个DecorView交给WindowManager打理就可以了。
下面看看整个的过程
A.向WindowManager添加DecorView;
handleResumeActivity@ActivityThread.java
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
decor.setVisibility(View.INVISIBLE);
ViewManager wm = a.getWindowManager();
WindowManager.LayoutParams l = r.window.getAttributes();
a.mDecor = decor;
l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
if (a.mVisibleFromClient) {
a.mWindowAdded = true;
wm.addView(decor, l);
}
B. WindowManagerImpl保存DecorView到mViews,创建对应的ViewRoot;
C.调用ViewRootsetView()方法
这个方法中的主要工作就是建立起与WindowManagerService之间的联系。
requestLayout();
try {
res = sWindowSession.add(mWindow, mWindowAttributes,
getHostVisibility(), mAttachInfo.mContentInsets);
} catch (RemoteException e) {
在这个方法中只需要关注两个步骤
(1)requestLayout()
请求WindowManagerService绘制GUI,但是注意一点的是它是在与WindowManagerService建立连接之前绘制,为什么要在建立之前请求绘制呢?
其实两者实际的先后顺序是正好相反的,与WMS建立连接在前,绘制GUI在后,那么为什么代码的顺序和执行的顺序不同呢?这里就涉及到ViewRoot的属性了,我们前面提到ViewRoot并不是一个View,而是一个Handler,那么执行的具体流程就是这样的:
a)ActivityThread的handler函数注册了启动一个新的Activity的请求处理LAUNCH_ACTIVITY,LAUNCH_ACTIVITY的处理过程调用到了ViewRoot的setView()方法,因此上图代码在被执行时正处于LAUNCH_ACTIVITY消息的处理过程中。
b)requestLayout()其实是向messagequeue发送了一个请求绘制GUI的消息,并且ViewRoot和ActivityThread共用同一个MessageQueue(如下图),因此绘制GUI的过程一定是在LAUNCH_ACTIVITY消息被处理完之后,也就是sWindowSessoin.add()方法调用完之后。
(2)sWindowSessoin.add()
从字面意思理解的话,IWindowSession sWindowSessoin是ViewRoot和WindowManagerService之间的一个会话层,它的实体是在WMS中定义,作为ViewRoot requests WMS的桥梁。
add()方法的第一个参数mWindow是ViewRoot提供给WMS,以便WMS反向通知ViewRoot的接口。由于ViewRoot处在application端,而WMS处在system_server进程,它们处在不同的进程间,因此需要添加这个IWindow接口便于GUI绘制状态的同步。
分享到:
相关推荐
android-collapse-calendar-view,简约炫酷,可以在月视图与周视图之间切换的calendar控件,博客附件,效果请查看博客相对应项目。
github上的开源项目android-pdfview,集成后需要添加libvudroid.so依赖.亲测可以打开本地pdf文件在应用中进行浏览翻页,效果不错。
Android-Timeline-View Android timeline to display horizontal sliding cards in recycler view, group by Day, Month or Year. Demo Video Apps using the library: Gourmet (http://thegourmet.app) Play...
android-smart-image-view
Android-Skin-Loader > 联系我 : fengjun.dev@gmail.com > > 个人博客 : http://allenfeng.com/ > > 一个通过动态加载本地皮肤包进行换肤的皮肤框架 更新日志 导入到Android Studio,使用gradle构建皮肤包(见7. ...
sample-of-Android-week-view This is a sample of android week view,Thanks the author of android week view ,The WeekHeaderView is based on android week view .This project contains two view ,the header ...
Android Auto Scroll ViewPager ViewPager which can auto scrolling, cycling, decelerating. ViewPager which can be slided normal in parent ViewPager. 中文介绍见: Android自动滚动 轮播循环的ViewPager ...
Android Week View is an android library to display calendars (week view or day view) within the app. It supports custom styling. Features Week view calendar Day view calendar Custom styling ...
1、android-support-v4.jar,android-support-v7-appcompat.jar,非常实用的jar文件,不可缺少,兼容Android 对应版本,包中包含类许多我们可以调用的,如widget、view、util等等。 2、导入Unity或者Android Studio...
基于android-target-tooltip修改的---新功能提示view(可自定义提示样式)
The android-page-curl is a 2D View which simulates a page curl effect. Without OpenGL, only the android canvas has been used, so that it can be used in any version of Android! Showcase Page Turner The...
simple-view-behavior Simple View Behavior for Android CoordinatorLayout. This library provide you easy ways to config and setup the view behavior without creating subclass of Behavior Installation ...
Android Dial Picker, a circular custom view that works just like a rotating dial. DialView is highly customizable via xml or code. You can set direction(left,top,right,bottom), max/min ranges, ...
Android自定义View实战---圆盘温度计
android-drag-square edit personal data which enables users to drag and rank image order 编辑个人资料,图片可拖拽排序。有点像可拖拽的gridView,但是会更流畅。这个demo是探探的个人资料编辑页面,受网上一位...
Android-LunarView A Chinese lunar calendar view. Screenshot Usage Use in xml: and you can add OnDatePickListener: lunarView.setOnDatePickListener(new LunarView.OnDatePickListener() { @Override ...
一个Android的图片查看的开源框架,是github上下载的,免费分享
Android--开发--ListView保持在列表的顶部固定View 案例分析 源码
Java项目:在Android中使用Model-View-Intent(MVI)架构模式下对Kotlin协程的性能分析
android-vertical-slide-view vertical slide to switch to the next fragment page. 仿照淘宝和聚美优品,在商品详情页,向上拖动时,可以加载下一页。使用ViewDragHelper,滑动比较流畅。 scrollView滑动到底部的...