Open MoJieBlog opened 4 years ago
Activity就像工匠,Window就像是窗户,View就像是窗花,LayoutInflater像剪刀,Xml配置像窗花图纸 Activity要管理View,需要通过Window来间接管理。Window通过addView()、removeView()、updateViewLayout()这三个方法来管理View。View需要通过Window来展示在Activity上。 Activity包含了一个PhoneWindow,而PhoneWindow就是继承于Window的,Activity通过setContentView将View设置到了PhoneWindow上,而View通过WindowManager的addView()、removeView()、updateViewLayout()对View进行管理。Window的添加过程以及Activity的启动流程都是一次IPC的过程。Activity的启动需要通过AMS完成;Window的添加过程需要通过WindowSession完成。 引用链接:https://www.jianshu.com/p/5297e307a688
Window 表示窗口,是个抽象的概念,每个 Window 都对应着一个 View 和一个 ViewRootImpl,Window 通过 ViewRootImpl 和 View 建立联系,因此 Window 并不是实际存在的,他是以 View 的形式存在的。也就是说 View 才是 Window 存在的实体。实际使用中无法直接访问 Window,对 Window 的访问必须通过 WindowManager。
View 是 Android 中视图的呈现方式,但是 View 不能单独存在,它必须附着在 Window 这个抽象的概念上,因此有视图的地方就有 Window。
Android 中的四大组件之一 Activity 就是用来显示视图的,因此一个 Activity 就对应着一个 Window,不止 Activity,其实 Dialog,Toast,PopUpWindow,菜单等都对应着一个 Window。
在 Activity 启动时 通过 attach 方法,创建 Window 的实例即 PhoneWindow 然后绑定 Activity,Activity 实现了 Window 的 Callback 等接口,当 Window 接收到外界的状态改变时就会回调给 Activity,比如 onAttachToWindow、onDetacheFromWindow、dispatchTouchEvent 等。 PhoneWindow 初始化时会创建 DecorView (也就是顶级 View),然后初始化 DecorView 的结构,加载布局文件到 DecorView,之后再将 Activity 的视图添加到 DecorView 的 mContentParent 中。
Activity 通过 Window 完成对视图 View 的管理,一个 Activity 对应一个 Window,每个 Window 又对应一个 View。
Activity view window的关系是 Activity->windos->view Activity是一个载体 View是一个视图 通过window完成Activity对View的视图管理 Activity和View 关联的windos是phoneWindow承继于window 通过WindowManager来对View AddView updateViewLayout removeView 操作 View的顶有是DecorView 通过Activity的setContentView把布局文件加载到DecorView 的mContentParent 中
在activity中调用attach,创建window; 创建的window是其子类phonewindow,在attach中创建phonewindow; 在activity中调用setcontentview (R.layout.xx);其实就是调用getwindow.setcontentview() 创建parentview;将指定的R.layout.xx布局进行填充 调用viewgroup 调用viewGroup先移除removeAllview();在进行添加新的view --addview().