Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-12-17:谈一谈Activity,View,Window三者的关系?

MoJieBlog opened this issue · comments

2019-12-17:谈一谈Activity,View,Window三者的关系?

在activity中调用attach,创建window;
创建的window是其子类phonewindow,在attach中创建phonewindow;
在activity中调用setcontentview (R.layout.xx);其实就是调用getwindow.setcontentview()
创建parentview;将指定的R.layout.xx布局进行填充
调用viewgroup
调用viewGroup先移除removeAllview();在进行添加新的view --addview().

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 表示窗口,是个抽象的概念,每个 Window 都对应着一个 View 和一个 ViewRootImpl,Window 通过 ViewRootImpl 和 View 建立联系,因此 Window 并不是实际存在的,他是以 View 的形式存在的。也就是说 View 才是 Window 存在的实体。实际使用中无法直接访问 Window,对 Window 的访问必须通过 WindowManager。

再说 View:

View 是 Android 中视图的呈现方式,但是 View 不能单独存在,它必须附着在 Window 这个抽象的概念上,因此有视图的地方就有 Window。

最后 Activity:

Android 中的四大组件之一 Activity 就是用来显示视图的,因此一个 Activity 就对应着一个 Window,不止 Activity,其实 Dialog,Toast,PopUpWindow,菜单等都对应着一个 Window。

Activity,View,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 中