现在的位置: 首页 > 综合 > 正文

android 事件模型原理

2017年12月25日 ⁄ 综合 ⁄ 共 1638字 ⁄ 字号 评论关闭

事件系統簡介

1.Android事件系統,它解決的是如何將按键、鼠标、觸屏消息从收集到最终将之发送到焦点窗口進行處理的問題
2.Android事件處理流程分两部分,一部分是从Framework开始,如何從底層读取事件并分发Activity。一部分是从内核开始,如何从触摸屏读取設備事件并帶到上層
3.EventHub它是系统所有事件的中央处理站,從驅動文件读取RawEvent

   InputReader利用EventHub讀取raw事件,并进行转化分类

   InputDispatcherInputReader读取的事件分发到各目标

   ViewRoot从管道接收到事件消息并带给activity处理

 

消息系統啟動

消息系统服务跟随WindowManagerService一起启动,随后在本地层创建InputReaderInputDispatch完成事件的读取、分发工作.
 
 
Android事件传递总体原理
1.Android 事件传递的设计核心是管道(Channel)通信机制
2.Android按键、触屏等输入事件经由跟WindowManagerService初始化的InputManager系统获取,并通过管道方式传递给ViewRootViewRoot再下发至ApplicationView。当有事件从硬件设备输入时,InputReader会检测到事件的发生,并传递给inputdispatcher进行分发,inputdispatcher通过管道(pipe)传递给ViewRoot。下面是管道建立过程,在App开启的时候,就会建立管道,管道一端放在viewroot,另一端在inputdispatcher。
 
由图可知,Activity创建时会最终调用到WindowManagerService.addWindow()函数。这里会利用socketpair()建立2socket描述符,它们可以进行双工通信。最后它们以inputchannel方式保存在一个2元数组里面。并且返回一个FDViewRoot通信。然后WindowManagerService继续调用mInputManager.registerInputChannel,将另一个FD继续传递到InputPublisher,这个负责分发事件的类。ViewRoot也会将FD传到本地层的InputConsumer中,也就是说只要InputPublisher发送了消息,InputConsumer就能马上收到。这样ViewRoot和底层的事件分发类InputDispatcher之间的管道就建立起来了,并且可以进行双工通信
 
消息的获取与分发
InputDispatcherInputReader分别用于分发和读取事件。其中InputDispatcher会调用dispatchOnce()不断分发事件,InputReader调用loopOnce()不断地读取事件。详细见以下图,看InputReader如何将事件传到InputDispatcher再传到ViewRoot。以下都是以键盘事件为例。
 
 
InputDispatcher将事件送入管道后,就会唤醒,另一端等待事件处理的进程NativeInputEventReceiver会调用handleEvent处理事件。见下图
Activity调用dispatchKeyEvent的时候,里面会调用receiver.onKeyDown(),receiver是Activity自己。所以重载Activity的dispatchKeyEvent()可以自定义按键,如果没有dispatchKeyEvent,重载onkeyDown()也可以。
系统级事件处理
如果是系统事件,将不会分发给应用程序,有两个地方
inputDispatcher.notifyKey在加入队列之前
inputDispatcher.dispatchkeyLocked在分发之前
这两各都可以拦截事件,交给系统窗口处理

抱歉!评论已关闭.