zoukankan      html  css  js  c++  java
  • Android View, Window,Activity概念区分(2)

    (1)View:最基本的UI组件,表示屏幕上的一个矩形区域。

    (2)Window: 表示一个窗口,不一定有屏幕那么大,可以很大也可以很小;
    它包含一个View tree和窗口的layout 参数。
    View tree的root View可以通过getDecorView得到。还可以设置Window的Content View。

    (3)Activity:Activity包含一个Window,该Window在Activity的attach方法中通过调用
    PolicyManager.makeNewWindo创建

    (4)WindowManager:一个interface,继承自ViewManager。 有一个implementation

    (5)class:android.view.WindowManagerImpl

    其实WindowManager并不是整个系统的窗口管理器,而是所在应用进程的窗口管理器。系统全局的窗口管理器运行在SystemServer进程中,是一个Service。

    ViewRoot通过IWindowSession接口与全局窗口管理器进行交互。 将一个View add到WindowManager时,WindowManagerImpl创建一个ViewRoot来管理该窗口的根View。并通过ViewRoot.setView方法把该View传给ViewRoot。

    ViewRoot用于管理窗口的根View,并和global window manger进行交互。ViewRoot中有一个nested class: W,W是一个Binder子类,用于接收global window manager的各种消息, 如按键消息, 触摸消息等。 ViewRoot有一个W类型的成员mWindow,ViewRoot在Constructor中创建一个W的instance并赋值给mWindow。 ViewRoot是Handler的子类, W会通过Looper把消息传递给ViewRoot。 ViewRoot在setView方法中把mWindow传给sWindowSession。



    ActivityThread.java中调用wm.addView(decor, l);把它加入到window manager
    proxy的mViews中,同时为这个decor view创建一个ViewRoot,ViewRoot负责协调decor view与window
    manager直接绘图、事件处理。

    ViewRoot中有IWindowSession和IWindow用来和window manger打交道和接收window
    manager传过来的消息,消息传过来后ViewRoot分发给decor view,再由decor view进行分发



    总之,每个窗口对应着一个Window对象,一个根View和一个ViewRoot对象。要想创建一个窗口,可以调用
    WindowManager的addView方法,作为参数的view将作为在该窗口上显示的根view

    一般来讲,Activity就是一 个可视的人机交互界面。
    每一个Activity都有一个默认的Window,一 般来讲,这个Window都是全屏的,当然也有例外,比如Dialog的Window就是非全屏的。Activity也可以利用默认Window以外的其 它的Window,比如弹出一个Dialog对话框。6 i8 J' I' b+ v. F% r
    Window里可见的内容,就是一层一层的View。Window里的View是通过setContentView这个接口set进去的,这个ContentView就是Window里处于最根部的View。
     
     
    对于屏幕显示而 言,整个是Activity 其实确切的说是window,为什么这样说呢?

    在Activityattach 函数里.有这样一句 mWindow = PolicyManager.makeNewWindow(this);

    这句是把Activiyt window关联起来了.真正关联的是PhoneWindow.

    这个window里显示的东西是view(activity是逻辑上的东 西,增加了生命周期管理等. 里面具体的东西也是view。而且启动activity的实现也是往window里加view),往window里加view,是通过调用WindowManager(WindowManagerImpl).addView()来实现的。

    为什么可以这样说呢?

    看public void setContentView(int layoutResID) {
    getWindow().setContentView(layoutResID);
    }


    在addView里,会为每个view创建一个viewRoot(这是逻辑上的东西,用来负责view的事件处理和逻辑处理,并和WindowsManagerService建立联系),而在WindowManagerImpl里,会维护viewRoot的数组。

    最 终会调用ViewRoot.setView(),在setView里会显示该view等。在setView的实现里,会调用Session.add()来addWindow,通过这个方法,会将ViewRoot和WindowManagerService联系起来(比如说分发事件等),并且这个方法里会调 用PhoneWindowManager.prepareAddWindowLw()。

    这只是模糊概念,还有细节需要推敲,我会继续努 力.如果你感觉是这么会事,你得给我顶了,我也不容易的.都很辛苦啊.
    齊帥
  • 相关阅读:
    跳转指定页面
    如何解决项目中.a文件中的.o冲突
    地图根据起点和终点计算中心点角度来绘制弧线 iOS
    codePush常用
    ios原生push到RN界面后pop
    atomic,nonatomic的区别
    KVC
    jQuery绑定event事件的各种方法比较
    Git常用命令总结
    多个$(document).ready()的执行顺序问题
  • 原文地址:https://www.cnblogs.com/qishuai/p/4496661.html
Copyright © 2011-2022 走看看