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开始处理

10.10 android输入系统_APP获得并处理输入事件流程的更多相关文章
- 10.9 android输入系统_APP跟输入系统建立联系和Dispatcher线程_分发dispatch
12. 输入系统_APP跟输入系统建立联系_InputChannel和Connection核心: socketpair // 第9课第3节_输入系统_必备Linux编程知识_任意进程双向通信(scok ...
- 10.1、android输入系统_必备Linux编程知识_inotify和epoll
1. inotify和epoll 怎么监测键盘接入与拔出? (1)hotplug机制:内核发现键盘接入/拔出==>启动hotplug进程==>发消息给输入系统 (2)inotify机制:输 ...
- Android系统--输入系统(五)输入系统框架
Android系统--输入系统(五)输入系统框架 1. Android设备使用场景: 假设一个Android平板,APP功能.系统功能(开机关机.调节音量).外接设备功能(键盘.触摸屏.USB外接键盘 ...
- Android系统--输入系统(一)必备的Linux知识_inotify和epoll
Android系统--输入系统(一)必备的Linux知识_inotify和epoll 引入 1. 笔记本电脑插入外接键盘,两个键盘都可以使用 a. 键盘即插即用--如何检测键盘的接入和拔出 hotpl ...
- 《深入理解Android 卷III》第五章 深入理解Android输入系统
<深入理解Android 卷III>即将公布.作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白.即Android Framework中和UI相关的部分. ...
- 10.7 android输入系统_Dispatcher线程情景分析_Reader线程传递事件和dispatch前处理
android输入系统C++最上层文件是com_android_serve_input_InputManagerService.cpp global key:按下按键,启动某个APP可以自己指定,修改 ...
- 10.12 android输入系统_InputStage理论
android应用程序对输入系统的处理分为多个阶段,我们把这些阶段称为InputStage 理论处理流程: (1)activity发给window,如果window不能处理,再由activity处理; ...
- 10.11 android输入系统_补充知识_activity_window_decor_view关系
android里:1个application, 有1个或多个activity(比如支付宝有:首页.财富.口碑.朋友.我的,这些就是activity)1个activity, 有1个window(每个ac ...
- 10.6 android输入系统_Dispatcher线程_总体框架
图解Android - Android GUI 系统 (5) - Android的Event Input System - 漫天尘沙 - 博客园.htm // 关注里面的Dispatcher处理流程h ...
随机推荐
- ios代理的使用,正向传值,逆向传值
#import <UIKit/UIKit.h> #import "SubViewController.h" @interface ViewController : UI ...
- vim 计算器寄存器使用
我们可能会在vim的使用中,碰到下面的情况 当我正在写一周预算的时候,我想计算下每天我买菜花2.7,每天买两顿,周死晚上出去吃,周六额外买1.5斤14.8一斤的猪肉... 这时候你打算怎么办呢,是不是 ...
- git 版本管理工具说明
$ git init (初始化本地仓库,会生成.git 文件夹 .git 文件夹里存储了所有的版本信息.标记等内容) $ git add . ...
- JavaScript--数据结构与算法之二叉树
树是一种非线性的数据结构,以分层的方式存储数据. 二叉树:查找非常快,而且二叉树添加或者删除元素也非常快. 形象的可以描述为组织结构图,用来描述一个组织的结构.树是由边连接的点组成.树的一些基本概念: ...
- js简易留言板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- golang sync.RWMutex
sync.RWMutex package main import ( "fmt" "runtime" "sync" ) func click ...
- 带你走进EJB--EJB和Spring对比(转)
http://blog.csdn.net/jnqqls/article/details/17723417 通过对EJB系列的总结和学习我们已经对EJB有了基本的了解,但是为了更进一步的去深入学习EJB ...
- Excel查询序列所相应的值-vLoopup函数,求比例分子改变但分母不变
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWV3ZWlvdXlhbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- Linux 网卡驱动学习(九)(层二转发)
1.mac 地址表的自学习过程 port1上的A计算机要与port2上的B计算机通信时,A发到交换机上,交换机收到信息后,交换机先记录发port1所相应的a的mac地址并记录在自己的mac表中,然后再 ...
- js数组遍历和对象遍历小结
数组的遍历 for循环 for(var j = 0,len = arr.length; j < len; j++){ console.log(arr[j]); } forEach,性能比for还 ...