0
点赞
收藏
分享

微信扫一扫

理解Window和WindowManager关系

小时候是个乖乖 2021-09-29 阅读 43

Window和WindowManager关联关系

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



从图可知,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。

举报

相关推荐

0 条评论