理解Window和WindowManager关系

Window和WindowManager关联关系

在了解WindowManager前,先看下Window与WindowManager的类图,如图:


理解Window和WindowManager关系_第1张图片

从图可知,ViewManager接口有三个方法,如下代码:

public interface ViewManager
{
    public void addView(View view, ViewGroup.LayoutParams params);
    public void updateViewLayout(View view, ViewGroup.LayoutParams params);
    public void removeView(View view);
}

接口WindowManager继承ViewManager并且有自己的方法,最终由WindowManagerImpl类实现WindowManager接口。接着看WindowManagerImpl类的代码,如下:

public final class WindowManagerImpl implements WindowManager {
    @UnsupportedAppUsage
    private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
    @Override
    public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
        applyDefaultToken(params);
        mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
    }
    @Override
    public void updateViewLayout(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
        applyDefaultToken(params);
        mGlobal.updateViewLayout(view, params);
    }
    @Override
    public void removeView(View view) {
        mGlobal.removeView(view, false);
    }
    @Override
    public void removeViewImmediate(View view) {
        mGlobal.removeView(view, true);
    }
    @Override
    public Display getDefaultDisplay() {
        return mContext.getDisplay();
    }
}

WindowManagerImpl类持有WindowManagerGlobal类引用mGlobal,在WindowManagerImpl实现的方法里把真正实现委托给WindowManagerGlobal类做。获取mGlobal对象是通过getInstance方法获得单例,由此看出本进程中只有一个对象。
通过接口ViewManager定义三个方法可看出,每个方法都包含View参数,实则WindowManager管理Window的View。Window是View载体,真正呈现出来的是View视图。好比Window是手机壳,View是手机。Window是一个抽象类,具体实现者是PhoneWindow。

WindowManager

我们在使用WindowManager时候需要知道LayoutParams类两大属性flags和type。

flags:

FLAG_NOT_FOCUSABLE:不获取焦点,此标记同时会启用FLAG_NOT_TOUCH_MODAL,最终事件会传递给下层具有焦点的Window。
FLAG_NOT_TOUCH_MODAL:将当前Window区域外的单击事件传递给下层Window,自己处理区域内的单击事件。如不开启,否则其他Window无法收到单击事件。
FLAG_SHOW_WHEN_LOCKED:Window显示在锁屏界面上。

type:

Window的type有三种分别是:

  • 应用程序Window,对应着一个Activity。
  • 子Window,不会单独出现如dialog,需要依附Activity。
  • 系统Window,如Toast和系统状态栏都是系统Window,我们在使用时候需要申明权限才能创建的Widow。

上面三种Window是分层的,层级大覆盖层级小的Window上。应用程序Window层级范围1-99,子Window层级范围1000-1999,系统Window层级范围2000-2999。

你可能感兴趣的:(理解Window和WindowManager关系)