什么是战略性了解:知其然,无需知其所以然,也就是知道整体结构框架即可,不追根内部具体实现。
注:文章前面会探索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