Android图形系统(四)-Activity、Window、View关系总结

本篇文章对之前3篇描述的Activity、Window、View关系做个粗略的总结

在 Activity 创建过程中执行 scheduleLaunchActivity() 之后便调用到了 handleLaunchActivity() 方法。

1 handleLaunchActivity内调用performLaunchActivity()

//创建目标Activity对象
activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent);

2 执行activity.attach()

//创建 PhoneWindow
mWindow = new PhoneWindow(this);

//与activity建立回调关联
mWindow.setCallback(this);

//设置并获取 WindowManagerImpl 对象
mWindow.setWindowManager(
(WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
mToken, mComponent.flattenToString(),
(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
mWindowManager = mWindow.getWindowManager();

针对WindowManager要多说两句,每个 Activity 会有一个 WindowManager 对象,这个 mWindowManager 就是和 WindowManagerService 进行通信,也是 WindowManagerService 识别 View 具体属于那个 Activity 的关键,创建时传入 IBinder 类型的 mToken。

3 回调 Activity.onCreate()

会执行setContentView方法
installDecor(); 主要就是初始化了DecorView
mLayoutInflater.inflate(layoutResID, mContentParent);//将layout解析为View树,添加到DecorView的contentView部分

这时只是创建了 PhoneWindow,和DecorView,但目前二者也没有任何关系。

4. WindowManagerGlobal.addView()

在ActivityThread.performResumeActivity 中,调用 r.activity.performResume(),调用 r.activity.makeVisible(), makeVisible中:WindowManager 的 addView 的具体实现在 WindowManagerImpl 中.而 WindowManagerImpl 的 addView 又会调用 WindowManagerGlobal.addView():

public void addView(View view, ViewGroup.LayoutParams params,Display display, Window parentWindow) {
...
ViewRootImpl root = new ViewRootImpl(view.getContext(), display);
view.setLayoutParams(wparams);
mViews.add(view);
mRoots.add(root);
mParams.add(wparams);
root.setView(view, wparams, panelParentView);
...
}

一个app进程共享一个WindowManagerGlobal,它是一个统筹大管家,内部方法主要是对View的处理 和 与 WMS的 IPC.

对View的处理交给它的得力助手ViewRootImpl:

5. ViewRootImpl setView()

以WindowManagerGlobal的addView为例,最终会调用ViewRootImpl setView()

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
synchronized (this) {

//开启DecorView绘制流程
requestLayout();
...
//将DecorView添加到window上
res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
getHostVisibility(), mDisplay.getDisplayId(),
mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
mAttachInfo.mOutsets, mInputChannel);
...
}
}

两张图总结下:

Android图形系统(四)-Activity、Window、View关系总结_第1张图片
Android图形系统(四)-Activity、Window、View关系总结_第2张图片

总结:
Activity主要作用还是生命周期的管理,Window是一个视图容器,将Activity与View解耦,WindowManager统一管理View。

所以, Activity与window的关联主要还是体现在生命周期的管理,和key touch事件回调上。 Window与View的关联体现在对View视图的处理上。

参考:
https://blog.csdn.net/freekiteyu/article/details/79408969

你可能感兴趣的