View、Window、WindowManager与WMS之间的关系

来源:互联网 发布:wp 利用 知乎 编辑:程序博客网 时间:2024/06/09 13:58

View是所有Android软件开发用户基本上每天都会接触到的, 它是控件,但View是怎么显示在手机屏幕上的呢?

1、Window是View的载体,没有Window, 所有的View都是毫无意义的,所有的View必须添加到Window中才能显示。

2、Window的对象在创建的同时会创建其顶层的DecorView(它就是一个顶层容器),DecorView中有一个叫ContentParent的ViewGroup,我们用户定义的xml文件即设置ContentParent这个View。

3、Window只是个存放View的容器,它想要显示在手机屏幕上,需要与WindowManager绑定。

4、WindowManager是安卓Framework层的一个服务,可通过context.getService(Context.WINDOW_SERVICE)获取到其实例
WindowManagerService是在Native层的一个服务。

5、WindowManager是WMS在Framework层的实现
以addView()为例: WindowManager.addView() -> WindowManagerGlobal.addView() -> ViewRootImpl.setView()
ViewRootImpl.setView()方法如下:

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {    synchronized(this) {        // 请求布局,该方法最终会异步发起performTraversals的执行        requestLayout();        try {            //通过WindowSession将我们的Window显示在屏幕上            res = sWindowSession.add(mWindow, mWindowAttributes,             getHostVisibility(), mAttachinfo.mContentInsets);        }    }}

我们会发现最终WindowManager的addView操作会交付给WindowSession执行操作,WindowSession又是什么呢?
从字面意思了解WindowSession为窗口会议,它的功能也的确如此,WindowSession的实例sWindowSession是在ViewRootImpl的构造函数中通过getWindowSession()获取到的
简化版代码如下:

/** * 真相了,因为WMS运行在Native端独立的进程中,所以只能将其实现好的IWindowManager接口转化为的Binder获取过来 * 它是IWindowManager该AIDL接口在Native端的具体实现。 * 我们通过asInterface 将该Binder transact 为Framework端可用的IWindowManager实例 */IWindowManager windowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));//通过windowManager建立会议sWindowSession = windowManager.openSession();

所以Framework端的WindowManager最终通过ViewRootImpl中的WindowSession向WMS发起请求,让WMS完成add、remove、update操作

阅读全文
0 0
原创粉丝点击