Android 事件分析

来源:互联网 发布:知学学院百度百科 编辑:程序博客网 时间:2024/05/23 10:43

总体流程:

WindowManagerService启动过程中会启动InputManager的一个服务,在这个服务中会开启两个线程,一个读线程,负责从系统读取设备事件,并写入一个事件队列。一个分发线程,负责将事件分发到目标应用。

Activity启动的过程中,会创建一个ViewRoot的实例,ViewRoot会初始化一个InputHandle的实例,并在setView 方法中,将其注册为消息接收通道的客户端 ,形成了一个服务端与客户端的通信管道,此时,服务端也会创建一块匿名共享内存来保存消息的具体信息。

当读线程接收到设备的事件后,分发线程会将事件的具体信息保存到匿名共享内存中,并通过通信管道通知客户端有事件发生。客户端得到通知后,会去共享内存中读取具体的事件信息。

客户端这边最先获取事件的是ViewRootViewRoot通过InputHandle获取事件,然后将事件分发给DecorViewDecorView会现将事件给ContentView处理,如果ContentView没有处理,则会交给Activity处理。

View这一层,事件先会分给ViewGroup,在ViewGroup中遍历后找到目标View之后交给目标View处理。



C++层

底层UML图如下:



InputManager:初始化的时候会初始化两个线程:InputDispatcherThreadInputReaderThread。并在start()函数里开启两个线程

EventHub:接收系统所有设备的事件,并提供了一个输入事件流

InputReaderThread:在loopThread中调用InputReader

InputReader通过调用EventHubgetEvent来读入输入事件,并把事件送到监听者。如有Motion事件的时候,事件会传递到InputListennotifyMotion

InputDispatcher:实现了InputListenerInterface,并分发事件给目标应用或窗口

InputListener:接收InputReader读入的事件,并将其放到一个事件队列中

InputPublisher:创建匿名内存与通信管道

InputChannel:通信通道,JavaInputChannel的本地类










原创粉丝点击