android window activity view,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);

...

}

}

两张图总结下:

2f9bb9da92ec

2f9bb9da92ec

总结:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值