1. View,ViewRoot和WindowManager简单介绍
1.1 View和ViewGroup
Android的基本布局控件,结构是树装,ViewGroup实现了ViewParent接口,每个View内部保留一个ViewParent变量,代表他的父节点
1.2 ViewRootImpl
ViewRoot概念的具体实现类,也实现了ViewParent接口,每个View树顶级ViewParent就是这个类,主要管理
- View树的measure,layout,draw
- 向WindowManagerService注册Window
- 接收WindowManagerService的事件回调
1.3 WindowManager
具体实现类WindowManagerImpl,不过最终任务委托给了WindowManagerGlobal对象,负责建立WindowManagerService连接和通信
ViewRootImpl的功能相当于中介,左手掌握的顶级View,右手掌握WindowManger通信
2. ViewRootImpl的起源
2.1 ViewRootImpl创建时机
这个和WindowManager是有点关联的,起点一般是Activity调用resume的时机,这个具体是在ActivityThread类中的
public final class ActivityThread {
final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
if (r.window == null && !a.mFinished && willBeVisible) {
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
decor.setVisibility(4);
wm = a.getWindowManager();
LayoutParams l = r.window.getAttributes();
a.mDecor = decor;
l.type = 1;
l.softInputMode |= forwardBit;
if (r.mPreserveWindow) {
a.mWindowAdded = true;
r.mPreserveWindow = false;
ViewRootImpl impl = decor.getViewRootImpl();
if (impl != null) {
impl.notifyChildRebuilt();
}
}
if (a.mVisibleFromClient) {
if (!a.mWindowAdded) {
a.mWindowAdded = true;
// 核心
wm.addView(decor, l);
} else {
a.onWindowAttributesChanged(l);
}
}
} else if (!willBeVisible) {
r.hideForNow = true;
}
}
}
wm.addView()函数是入口,wm实际是WindowManager对象,WindowManager真正做工作的类是WindowManagerGlobal
addView()实际上是添加的DecorView ,从r.window获取(Activity的话window实现类是PhoneWindow)
public final class WindowManagerGlobal {
public void addView(View view, android.view.ViewGroup.LayoutParams params, Displa

最低0.47元/天 解锁文章
7260

被折叠的 条评论
为什么被折叠?



