本篇文章对之前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);
...
}
}
两张图总结下:
总结:
Activity主要作用还是生命周期的管理,Window是一个视图容器,将Activity与View解耦,WindowManager统一管理View。
所以, Activity与window的关联主要还是体现在生命周期的管理,和key touch事件回调上。 Window与View的关联体现在对View视图的处理上。
参考:
https://blog.csdn.net/freekiteyu/article/details/79408969
网友评论