战略性了解WindowManager

什么是战略性了解:知其然,无需知其所以然,也就是知道整体结构框架即可,不追根内部具体实现。
注:文章前面会探索API 14的源码,后面会探索API 28的源码


WindowManager直译过来叫做窗口管理者,用了这么多年Window的我们,应该对窗口这个概念并不陌生,打开应用,弹出应用窗口,使用应用。电脑屏幕大,所以我们可以在一个电脑屏幕上看到多个应用,手机屏幕小,只看一个应用的体验比较好。

如果是我们要写一个类叫做WindowManager,我们会写哪些方法呢?每个应用都给他分配一个WindowManager,然后添加界面,删除界面,更新界面,差不多就这些方法吧,等有需求了再拓展嘛,嗯嗯,大概是这个逻辑。看看实际是怎么实现的吧。

ViewManager探索

根据源码,我们很轻易的发现WindowManager其实是一个接口,并且继承ViewManager,ViewManager也是个接口。

public interface WindowManager extends ViewManager

ViewManager听着像是管理View的,感觉添加View删除View什么的都在这里,别猜了,先看看源码:

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

添加View,更新View布局,移除View,方法名字倒是一目了然的,但是为啥没有deleteView,难道Android窗口这里不会删除View吗,感觉移除操作很简单,只需要把View设置为不可见就行了,也不知道内部怎么实现的,根据方法名字猜想一波吧。

WindowManager探索

我们还是来看看继承了ViewManager的WindowManager,看看他又实现了啥,最开始猜想的添加删除view居然是
ViewManager的方法,现在都不知道WindowManager这个类是干嘛的了,看波源码再做打算。

public interface WindowManager extends ViewManager {
    
    public static class BadTokenException extends RuntimeException {
        public BadTokenException() {}
        public BadTokenException(String name) {
            super(name);
        }
    }

    public Display getDefaultDisplay();

    public void removeViewImmediate(View view);

    public boolean isHardwareAccelerated();
    
    public static class LayoutParams extends ViewGroup.LayoutParams
            implements Parcelable{
            // 各种属性
    }
}

内部居然有个异常类,倒是挺简单;还有个静态公共类,是我们熟悉的LayoutParams,原来是在这里定义的。

接着是三个待实现的接口方法,我们来猜猜是干嘛的:

    // 获取默认Display实例
    public Display getDefaultDisplay();
    // 立刻移除View
    public void removeViewImmediate(View view);
    // 是否使用硬件加速
    public boolean isHardwareAccelerated();

猜测完毕,源码看到这里,下面两个方法倒是还是好理解,第一个方法不知道Display是啥东西,感觉是跟屏幕有点关系,看看源码大部分都是一些get的方法,听着都像是获取屏幕都信息:

// 随便摘要一些方法
public class Display {
    ...
    public void getSize(Point outSize){...}
    public int getDisplayId(){...}
    public int getWidth(){...}
    public int getHeight(){...}
    public void getRealSize(Point outSize){...}
    ...
}

大概了解一些方法是干嘛的,不求甚解。确实,主要的一些方法还是跟屏幕有关系。

WindowManagerImpl探索

既然大概知道了WindowManager的结构,那么来了解一下WindowManager的子类吧。

WindowManager的子类有这么几个,除去Test旗下的类,在剩下的类中,有一个类带着主角脸,那就是WindowManagerImpl,既然这个类自带主角脸,那么我们主要就来探索一下这个类。

进去这个类之后,发现这个类只有500多行的代码,难得源码才500多行,好好研究一下。既然继承了WindowManager和ViewManager接口,不然先看看WindowManagerImpl对这几个方法具体这么实现的。

ViewManager方法的具体实现

首先看看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);
}

第一个是addVie

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值