导语
从Wms角度来看,一个窗口并不是Window类,而是一个View类。Wms收到用户的消息之后,需要把消息派发到窗口,View类本身不能直接接收Wms传来的消息,真正接收用户消息的必须是IWindow类,而ViewRoot.W就是IWindow的子类,而在W类中包含着一个View的变量
Wms 并不介意窗口(View)是属于 哪个应用程序的,Wms会按一定规则判断哪个窗口处于活动状态,然后把消息给W类,W类在把用户消息给内部的View变量,剩下的就由View处理
窗口的类型
FrameWork 定义了三种窗口类型
- 应用窗口:所谓的应用窗口一般是指该窗口对应一个Activity。由于加载Activity是由ams完成的,所以app想创建一个应用类窗口,只能通过Activity
- 子窗口:必须有一个父窗口,这个父窗口可以是应用窗口,也可以是其他类型的窗口(dialog).
- 系统窗口:系统窗口不需要任何的Activity,也不需要父窗口。对应用程序理论上是无法创建系统窗口的,因为应用程序没有权限,而系统进程可以创建(Toast和状态栏)
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);
参数解释
- appContext:Activity是ContextWrapper子类,appContext用于设置mBase上一篇
- this:ActivityThread的实例
- getInstrumentation():返回一个Instrumentation对象,用于监控应用程序和系统之间的交互操作,Activity中有着个成员变量
- r.token:r的对象类型为ActivityClientRecord,token是它的成员变量,类型为Binder,指向ams的内部的一个ActivityRecord对象。
每启动一个Activity,就会创建一个ActivityClientRecord对象,与其对应的,ams在内部也会创建一个ActivityRecord对象,都是用于描述将要启动的Activity的信息 - app:Application
剩下的过程可以看相关文章2
在Activity的成员变量中有个mToken,它被赋值为ams中的ActivityRecord对象
而在Window中的mAppToken也会被赋值,如果该Window属于Activity,那么就被该Activity的mToken赋值
直接到WindowManagerGlobal.addView
ViewRootImpl