window
- 每一个Activity 只包含一个phoneWindow,这个phoneWindow 就是Activity根window
- window初始化是就有一个包含DecorView的根布局,当我们调用windowManager.addView的时候(没有指定parent),view都会默认添加到根布局(DecorView)中.
- 我们可以把window看作photoshop中的图层。为什么这么说呢 ? 举个例子dialog 总是显示在Activity 上面,其实是Activity对应DecoreView根布局,添加了dialog 对应布局DecoreView布局,因为我们知道dialog decorView 包含我们真正显示的内容.
windowManager
- WindowManager主要用来管理窗口的一些状态、属性(获取activity屏幕大小)、view增加、删除、更新、窗口顺序、消息收集和处理等
- windowManager 因为实现ViewManager,所以包含ViewManager的addView、updateViewLayout、removeView 这三个方法.
在不同上下文中获取windowManager
1. 在Activity 中
this.getSystemService(Context.WINDOW_SERVICE)
注: 每一个Activity 都继承了Context,所以可以调用Context类中定义的getSystemService
2. 在dialog 中
this.context.getSystemService(Context.WINDOW_SERVICE)
3. 获取activity 屏幕信息
DisplayMetrics dm =new DisplayMetrics();
WindowManager manager = (WindowManager) this.mContext.getSystemService(Context.WINDOW_SERVICE);
manager.getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels; // 获取屏幕宽(单位:dp)
int height = dm.heightPixels ;// 获取屏幕高(单位:dp)
decorView 顶级视图


参考:
Activity、View、Window的理解一篇文章就够了 Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析: PolicyManager工厂模式与动态加载: Activity、Window和View三者间的关系有一定的见解: