Android Window 理解

本文围绕Android的Window展开,介绍其是抽象类,唯一实现类为PhoneWindow,所有视图通过它呈现。阐述了Window三种类型,即应用、子、系统Window。还说明了WindowManager负责管理Window中的View,以及Window创建过程和Activity、Window、View之间的关系。
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上了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值