重学Android(一) Window理解

39 阅读2分钟

Window是什么

Abstract base class for a top-level window look and behavior policy.

An instance of this class should be used as the top-level view added to the window manager.

It provides standard UI policies such as a background, title area, default key processing, etc.

The only existing implementation of this abstract class is android.view.PhoneWindow, which you should instantiate when needing a Window.

public abstract class Window

翻译过来: Window 是顶级窗口外观和行为策略的抽象基类。它的实例应用作添加到 WindowManager 的顶级视图。它提供了标准的 UI 策略,例如背景、标题区域、默认按键处理等。 此抽象类的唯一现有实现是 android.view.PhoneWindow,您应该在需要 Window 时对其进行实例化。

通俗的理解:

window是android一个窗口的概念,可以理解为屏幕的一块显示区域。可以用于设置背景颜色,标题区域等。

通常我们熟悉的View体系需要依附在Window上才能展示,在这个角度上Window可以理解为一个View树的载体,多个Window通过Window本身大小,Z轴设置可以在屏幕上展示多个内容。

通过注释我们 知道 Window的实现类是PhoneWindow, 我们看看这个类是在哪里使用的:

PhoneWindow

Activity初始化中创建:

// Activity.java  
final void attach(...) {
        attachBaseContext(context);
        // 1 创建 PhoneWindow对象
        mWindow = new PhoneWindow(this, window, activityConfigCallback);
        ...
        // 设置WindowManager (后续我们会展开WindowManager)
        mWindow.setWindowManager(
                (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
                mToken, mComponent.flattenToString(),
                (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
 
        mWindowManager = mWindow.getWindowManager();
        ...
       
    }

Dialog中创建:

Dialog(@UiContext @NonNull Context context, @StyleRes int themeResId,
            boolean createContextThemeWrapper) {
        ...
        mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        // 1 创建phoneWindow对象
        final Window w = new PhoneWindow(mContext);
        mWindow = w;
          ...
        // 2 设置WindowManager 
        w.setWindowManager(mWindowManager, null, null);
        w.setGravity(Gravity.CENTER);
    }

从这里我们可以了解到:

  1. 每个Activity都持有一个PhoneWindow对象
  2. 每个Dialog也持有一个PhoneWindow对象

总结:

  1. Window是Android一个显示窗口的含义,Viewy是依附在Window上显示的
  2. 每个Activity和Dialog都持有一个Window对象

Window的功能有哪些?,WindowManager和它是什么关系,它真正展示逻辑在哪里,我们下期分享。

备注:DisplayContent