理解Window和WindowManager

Window是一个抽象类,它的具体实现是PhoneWindow;

public abstract class Window {}
public class PhoneWindow extends Window implements MenuBuilder.Callback {}

Window有三种类型:应用Window、子Window和系统Window。
可以设置WindowManager.LayoutParams.type这个参数。
应用类Window对应一个Activity。子Window不能单独存在,它需要附属在特定的父Window中。常见的一写Dialog就是一个子Window。系统Window是需要声明权限才能创建Window。比如Toast是系统Window。
Window是分层的,每个类型的Window对应不同的层级。
应用Window的层级范围是1~99;子Window的层级范围是1000~1999;系统Window的层级范围是2000~2999;
系统Window的层级是最大的。一般我们可以选用TYPE_SYSTEM_OVERLAY或者TYPE_SYSTEM_ERROR,
可以采用设置type参数 mLayoutParams.type=LayoutParams.TYPE_SYSTEM_ERROR;同时声明权限:

WindowManager有常用的三个方法:添加View、更新View和删除View。这个三个方法定义在了ViewManager中。
WindowManager是一个接口 继承了ViewManager;

public interface WindowManager extends ViewManager{}
public interface ViewManager {
    void addView(View var1, LayoutParams var2);

    void updateViewLayout(View var1, LayoutParams var2);

    void removeView(View var1);
}

Window的添加过程需要通过WindowManager的addView来实现。
WindowManager是一个接口,它的真正实现是WindowManagerImpl类。在WindowManagerImpl中三个方法的主要代码:

private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
@Override
    public void addView(View view, ViewGroup.LayoutParams params) {
        mGlobal.addView(view, params, mDisplay, mParentWindow);
    }

    @Override
    public void updateViewLayout(View view, ViewGroup.LayoutParams params) {
        mGlobal.updateViewLayout(view, params);
    }

    @Override
    public void removeView(View view) {
        mGlobal.removeView(view, false);
    }

可以看出WindowManagerImpl并没有直接实现这三个方法,而是交给了WindowManagerGlobal来处理。而从WindowManagerGlobal中的三个方法里都是通过ViewRootimpl类来具体实现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值