创建窗口的过程

2018-10-14  本文已影响11人  咸鱼佬

导语

从Wms角度来看,一个窗口并不是Window类,而是一个View类。Wms收到用户的消息之后,需要把消息派发到窗口,View类本身不能直接接收Wms传来的消息,真正接收用户消息的必须是IWindow类,而ViewRoot.W就是IWindow的子类,而在W类中包含着一个View的变量

Wms 并不介意窗口(View)是属于 哪个应用程序的,Wms会按一定规则判断哪个窗口处于活动状态,然后把消息给W类,W类在把用户消息给内部的View变量,剩下的就由View处理

窗口的类型

FrameWork 定义了三种窗口类型

Window是分层的,每个Window都有对应的z-ordered,层级大的会覆盖在层级小的Window上
应用窗口的Window的层次范围是1--99
子系统窗口的Window的层次范围是1000--1999
系统窗口的window层次范围是2000-2999

创建应用窗口

① 每个应用类窗口都对应一个Activity对象,因此,创建应用类窗口首先需要创建一个Activity对象。当Ams决定启动某个Activity的时候,会通知客户端进程,而每个客户进程都会有个ActivityThread类,任何Activity都必须隶属某个应用程序,因此启动Activity最终由ActivityThread完成
相关文章1
相关文章2

ActivityThread#performLaunchActivity

activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);

activity.attach(appContext, this, getInstrumentation(), r.token,
                    r.ident, app, r.intent, r.activityInfo, title, r.parent,
                    r.embeddedID, r.lastNonConfigurationInstances, config,
                    r.referrer, r.voiceInteractor, window);

参数解释

剩下的过程可以看相关文章2
在Activity的成员变量中有个mToken,它被赋值为ams中的ActivityRecord对象
而在Window中的mAppToken也会被赋值,如果该Window属于Activity,那么就被该Activity的mToken赋值

从这图可以看出事件流是怎么流向Activity的

直接到WindowManagerGlobal.addView

image

ViewRootImpl

image
上一篇 下一篇

猜你喜欢

热点阅读