10.10 android输入系统_APP获得并处理输入事件流程

APP对fd/InputChannel的注册过程:

new WindowInputEventReceiver extends InputEventReceiver//InputEventReceiver类的dispatchInputEvent函数会调用onInputEvent

  onInputEvent函数在收到事件后被调用//被父类的dispatchInputEvent调用

在InputEventReceiver的构造函数中调用nativeInit

nativeInit//从java进入C++

  new NativeInputEventReceiver

    consumeEvents//调用Java层的函数dispatchInputEvent

      dispatchInputEvent

最后会把fd加入epoll去监控

APP获得并处理输入事件流程

pollOnce

 polInner

  epoll_wait//等待各种事件的发生

  pushResponse(events,mRequests.valueAt(requestIndex))构造response放入某个缓冲区

  Response& response = mResponses.editItemAt(i)//从缓冲取出response

  int callbackResult = response.request.callback->handleEvent(fd,events,data)

   consumeEvents(env,false,-1,NULL)

    mInputConsumer.consume(...,&seq,&inputEvent)

     mChannel->receiveMessage(&mMsg)

      nRead = ::recv(mFD,msg,sizeof(InputMessage),MSG_DONTWAIT)

     initializeKeyEvent(keyEvent,&mMsg)

     *outSeq = mMsg.body.key.seq

     *outEvent = keyEvent 

    inputEventObj = android_view_KeyEvent_fromNative(env,static_cast<KeyEvent*>(inputEvent))

    env->CallVoidMethod(receiverObj.get(),gInputEventReceivrrClassInfo.dispatchInputEvent,seq,inputEventObj)

     onInputEvent(event)

      enqueueInputEvent(event,this,0,true)

       mPendingInputEventTail =q

       doProcessInputEvents//处理众多的输入事件

        QueueInputEvent q = mPendingInputEventHead;

        mPendingInputEventHead = q.mNext

        deliverInputEvent(q)

         stage = q.shouldSkipIme()?mFirstPostImeInputStage:mFirstInputStage;//如果应用程序使用输入法,就从mFirstInputStage开始处理,如果不使用输入法,就从mFirstPostImeInputStage开始处理

         stage.deliver(q)

InputStage stage的分析见下图   

如果应用程序使用输入法,就从mFirstInputStage开始处理,如果不使用输入法,就从mFirstPostImeInputStage开始处理

  

原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/9168935.html

时间: 2024-11-09 00:08:30

10.10 android输入系统_APP获得并处理输入事件流程的相关文章

10.1、android输入系统_必备Linux编程知识_inotify和epoll

1. inotify和epoll 怎么监测键盘接入与拔出? (1)hotplug机制:内核发现键盘接入/拔出==>启动hotplug进程==>发消息给输入系统 (2)inotify机制:输入系统使用inotify来监测目录/dev/input android使用inofity机制 当插入多个键盘时,系统怎么知道哪个键盘被按下? android下使用epoll,可以同时监控多个文件,当文件发生改变,其会知道谁变化了 参考代码:frameworks\native\services\inputfli

《深入理解Android 卷III》第五章 深入理解Android输入系统

<深入理解Android 卷III>即将公布.作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白.即Android Framework中和UI相关的部分.在一个特别讲究颜值的时代,本书分析了Android 4.2中WindowManagerService.ViewRoot.Input系统.StatusBar.Wallpaper等重要"颜值绘制/处理"模块 第5章 深入理解Android输入系统(节选) 本章主要内容: ·  研究输入事件从设

10.5 android输入系统_Reader线程_使用EventHub读取事件和核心类及配置文件_实验_分析

4. Reader线程_使用EventHub读取事件 使用inotify监测/dev/input下文件的创建和删除 使用epoll监测有无数据上报 细节: a.fd1 = inotify_init("/dev/input") b.假设input下已经有了event0和event1 fd2 = open("/dev/input/event0") fd3= open("/dev/input/event1") c.使用epoll_wait监测fd1.f

10.6 android输入系统_Dispatcher线程_总体框架

图解Android - Android GUI 系统 (5) - Android的Event Input System - 漫天尘沙 - 博客园.htm // 关注里面的Dispatcher处理流程http://www.cnblogs.com/samchen2009/p/3368158.html Dispatcher线程框架: 分发 问:发什么?发给谁? Dispatcher流程如下: 获得事件: (1)放入队列前先稍加处理:分类(Global输入/System输入/User输入).处理紧急事件

OSX 10.10.5 编译android 5.1.1源码

1.亲测可用的环境: 系统:OSX 10.10.5 JDK:1.7 Xcode:5.1.1 (自带的Xcode 6 在编译过程中出现了 string 头文件找不到的error,没找到解决方案,换到Xcode 5.1.1后问题解决) Command Line Tools:5.1.1 2.期间遇到的问题: ①.MacPorts下载下来安装一直停留在安装界面不动: 搞来搞去也搞不清楚为什么,看有的说是更新问题,最后换成了Homebrew,飕飕快,挺好(*^__^*) ②.make完源码后,emulat

[iOS]超详细Apache服务器的配置(10.10系统)

配置目的:有一个自己专属的测试服务器 我们需要做以下事情: 1.新建一个目录,存放网页 2.修改Apache配置文件httpd.conf - 修改两个路径 - 增加一个属性 - 支持PHP脚本 3.拷贝php.ini文件 一.新建一个目录,存放网页 注意:不要将目录放在桌面或者文稿等个人文件夹中 一般放在如下目录中: /Users/xxxx/Sites 其中xxxx用电脑的当前用户名替换,如下图,我的是janlor 在10.10.3系统中已经默认存在该目录(即“站点”),不需要新建Sites文件

windows环境下安装win8.1+Mac OS X 10.10双系统教程

首先要感谢远景论坛里的各位大神们的帖子  没有他们的分享我也不能顺利的装上Mac OS X 10.10! 写这篇随笔主要是为了防止自己遗忘,同时给大家分享下我的经验. 本教程适用于BIOS+MBR分区的朋友们使用 首先介绍下我的电脑硬件信息 安装环境为:win8.1系统 引导方式为:变色龙r2378 一.准备工作 1.下载Mac OS X 10.10镜像(本镜像为懒人版镜像非官方镜像) 地址:http://pan.baidu.com/s/1gdEf4Gj 2.下载所需要使用到的工具,我将所有需要

osx 10.10.1编译 Android 4.4.4_r2

一.下载android 4.4.4_r2源码 1.创建目录:cd ~ && mkdir bin src 2.切换到bin 目录,按官方教程初始化好repo文件 3.设置检出android源码相关的host ip地址为nslookup g.cn查询出来的IP地址:本次编译使用的host  ip地址(加入到hosts列表) 203.208.46.148 googlesource.com 203.208.46.148 www.googlesource.com 203.208.46.148 and

Android基础入门教程——10.14 Android GPS初涉

Android基础入门教程--10.14 Android GPS初涉 标签(空格分隔): Android基础入门教程 本节引言: 说到GPS这个名词,相信大家都不陌生,GPS全球定位技术嘛,嗯,Android中定位的方式 一般有这四种:GPS定位,WIFI定准,基站定位,AGPS定位(基站+GPS): 本系列教程只讲解GPS定位的基本使用!GPS是通过与卫星交互来获取设备当前的经纬度,准确 度较高,但也有一些缺点,最大的缺点就是:室内几乎无法使用-需要收到4颗卫星或以上 信号才能保证GPS的准确