Activity ,window 与view 关系

2,062 阅读1分钟

window

  1. 每一个Activity 只包含一个phoneWindow,这个phoneWindow 就是Activity根window
  2. window初始化是就有一个包含DecorView的根布局,当我们调用windowManager.addView的时候(没有指定parent),view都会默认添加到根布局(DecorView)中.
  3. 我们可以把window看作photoshop中的图层。为什么这么说呢 ? 举个例子dialog 总是显示在Activity 上面,其实是Activity对应DecoreView根布局,添加了dialog 对应布局DecoreView布局,因为我们知道dialog decorView 包含我们真正显示的内容.

windowManager

  1. WindowManager主要用来管理窗口的一些状态、属性(获取activity屏幕大小)、view增加、删除、更新、窗口顺序、消息收集和处理等
  2. 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三者间的关系有一定的见解: