Window概念
Window是一个抽象类,它的唯一实现类是PhoneWindow,Android中的所有视图都是通过Window来呈现的。WindowManager则为Window的管理者,负责添加,删除,更新window中的View。
Window可以理解为画板,View是具体的画,WindowManager是画笔或橡皮檫。View必须依附于画板,并可以通过WindowManager进行添加,插除和更新具体的画。
Window 的三种类型
- 应用 Window
应用Window需要对应一个Activity - 子 Window
子Window不能单独存在,需要依附在父Window上,比如Dialog就是一个子Window - 系统 Window
系统Window需要声明权限才能创建,比如Toast和系统状态栏都是系统Window
WindowManager
我们对 Window 的操作是通过 WindowManager 来完成的,WindowManager 是一个接口,它继承自只有三个方法的 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);
}
Activity通过WindowManager提供的三个方法间接对View进行管理, 即添加 View、更新 View 和删除 View。
Window创建过程
window的创建是在LaunchActivity第四步attach方法中调用PolicyManager.makeNewWindow进行的。
mWindow = PolicyManager.makeNewWindow(this);
public Window makeNewWindow(Context context){
return new PhoneWindow(context);
}
Activity视图是通过setContentView依附到Window上的。
public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
phoneWindow的setContentView代码步骤:
1.如果没有DecorView则创建它,DecorView是Activity的顶级View,是一个FrameLayout
2.将View添加到DecorView的content区域
3.回调Activity的onContentChanged方法通知视图已改变
4.handleResumeActivity中调用makeVisible()方法将decorView加入到WindowManager中并设置为可见
Activity Window View 关系
Activity是画架,画架上挂着画板
Window是画板,画板上有具体的画(View)
View是具体的画。View必须画在画板上,并可以通过画笔或橡皮檫(WindowManager)进行添加,插除和更新的图画。
Window是连接Activity和view的桥梁。Activity里有一个phoneWindow对象,phoneWindow里面实现了DectorView,Activity调用setcontentView把view放置在DectorView的Content区域,这样view就关联到activity上了。