美文网首页
创建窗口的过程

创建窗口的过程

作者: 咸鱼佬 | 来源:发表于2018-10-14 09:09 被阅读11次

导语

从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赋值

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

直接到WindowManagerGlobal.addView

image

ViewRootImpl

image

相关文章

  • 创建窗口的过程

    导语 从Wms角度来看,一个窗口并不是Window类,而是一个View类。Wms收到用户的消息之后,需要把消息派发...

  • Android创建窗口(二)创建Dialog

    在Android创建窗口(一)创建应用窗口中介绍了应用窗口的创建过程,本文将介绍一下Dialog的创建过程。创建D...

  • 新建一个窗口程序

    新建一个窗口程序 消息机制 创建窗口的几个步骤 创建窗口类 注册窗口类 创建窗口 显示窗口 构建消息循环 创建过程...

  • 创建应用窗口过程

    1.每个窗口都对应一个Activity对象,所以创建应用窗口首先是创建Activity.而启动Activity的任...

  • 系统窗口创建过程

    客户端通过以下方式添加系统窗口 之后系统的调用流程如下: WindowManagerServices$addWindow

  • Android创建窗口的过程

    Window 、 WindowManager 和 WMS Window Window,一个抽象类,具体的实现类为P...

  • Android 输入法窗口焦点获取流程(1),窗口和Sessio

    基于Android9.x 目录 窗口创建和WindowSession创建 窗口创建 attatch 该过程主要是完...

  • 系统窗口Toast创建过程

    1.系统窗户的含义 因为在Wms调用addWindow()添加窗口时,会调用WindowManagerPolicy...

  • Android中窗口的创建过程

    从WindowManagerService的角度来看,标题中所说的“窗口”并非Window类,而是一个View类。...

  • WNDCLASS 结构

    WNDCLASS 结构 Windows 的窗口总是基于窗口类来创建的,窗口类同时确定了处理窗口消息的窗口过程(回调...

网友评论

      本文标题:创建窗口的过程

      本文链接:https://www.haomeiwen.com/subject/nthzaftx.html