Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
MoJieBlog opened this issue Dec 17, 2019 · 4 comments
Open

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

MoJieBlog opened this issue Dec 17, 2019 · 4 comments

Comments

@MoJieBlog
Copy link
Collaborator

No description provided.

@gabyallen
Copy link

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

@Quyunshuo
Copy link

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

@huazidev
Copy link

huazidev commented Jun 4, 2020

首先先说下 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。

@mlinqirong
Copy link

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 中

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants