Android的输入事件分发机制笔记
来源:互联网 发布:网页游戏发布平台源码 编辑:程序博客网 时间:2024/06/06 01:36
笔记来自老罗原文:
http://blog.csdn.net/luoshengyang/article/details/6882903
1) InputManager的启动:
Android系统的键盘事件是由InputManager来监控的,而InputManager是由窗口管理服务WindowManagerService来启动的。
2) 应用程序注册键盘消息接收通道的过程分析
A. 即将会被激活的Activity窗口,会通知InputManager,它是当前激活的窗口,因此,一旦发生键盘事件的时候,InputManager就把这个键盘事件抛给这个Activity处理;
B. 应用程序会为这个Activity窗口和InputManager之间创建一个键盘消息接收通道,这个通道的一端由一个Server端的InputChannel构成,另一端由Client端的InputChannel构成,Server端的InputChannel注册在由InputManager所管理的InputDispatcher中,而Client端的InputChannel注册在由应用程序主线程的消息循环对象Looper中;
C. 注册在InputDispatcher中的InputChannel由一个反向管道的读端和一个前向管道的写端组成,而注册在应用程序主线程的消息循环对象Looper中的InputChannel由这个前向管道的读端和反向管道的写端组成,这种交叉结构使得当有键盘事件发生时,InputDispatcher可以把这个事件通知给应用程序。
3) InputManager分发键盘消息给应用程序的过程分析
A. 键盘事件发生,InputManager中的InputReader被唤醒,此前InputReader睡眠在/dev/input/event0这个设备文件上;
B. InputReader被唤醒后,它接着唤醒InputManager中的InputDispatcher,此前InputDispatcher睡眠在InputManager所运行的线程中的Looper对象里面的管道的读端上;
C. InputDispatcher被唤醒后,它接着唤醒应用程序的主线程来处理这个键盘事件,此前应用程序的主线程睡眠在Client端InputChannel中的前向管道的读端上;
D. 应用程序处理处理键盘事件之后,它接着唤醒InputDispatcher来执行善后工作,此前InputDispatcher睡眠在Server端InputChannel的反向管道的读端上,注意这里与第二个线索处的区别。
4) 应用程序注销键盘消息接收通道的过程分析
当我们按下键盘上的Back键时,当前激活的Activity窗口就会被失去焦点,但是这时候它还没有被销毁,它的状态被设置为Stopped;当新的Activity窗口即将要显示时,它会通知WindowManagerService,这时候WindowManagerService就会处理当前处理Stopped状态的Activity窗口了,要执行的操作就是销毁它们了,在销毁的时候,就会注销它们之前所注册的键盘消息接收通道。
Android的输入事件,由系统输入事件管理器来统一管理的,对应的服务叫做inputManagerService。
当用户输入键盘或者触摸事件的时候,InputManger负责监控并接收这些事件,然后分发给当前活动的窗口(在创建InputManger对象的时候,其实在c层创建了两个线程InputReader和InputDispatcher,负责监控输入事件和分发事件)。那么怎么分发给当前激活的窗口呢?在activity即将被激活的时候,activity会到InputManger注册一个键盘消息接收通道,activity销毁的时候会注销这个通道,这个注销不是即时的,也就是当下一个activity要显示的时候,会自动注销前面注册的消息通道。
总结:了解触摸/键盘输入事件的基本过程。
用户点击键盘或者触摸屏,会经过InputManager,InputManager的InputReader负责监控读取按键信息,InputDispatcher负责分发事件给当前激活的activity。激活的activity是activity要向inputManager注册一个消息接收通道,当activity销毁时会注销通道。
http://blog.csdn.net/luoshengyang/article/details/6882903
1) InputManager的启动:
Android系统的键盘事件是由InputManager来监控的,而InputManager是由窗口管理服务WindowManagerService来启动的。
2) 应用程序注册键盘消息接收通道的过程分析
A. 即将会被激活的Activity窗口,会通知InputManager,它是当前激活的窗口,因此,一旦发生键盘事件的时候,InputManager就把这个键盘事件抛给这个Activity处理;
B. 应用程序会为这个Activity窗口和InputManager之间创建一个键盘消息接收通道,这个通道的一端由一个Server端的InputChannel构成,另一端由Client端的InputChannel构成,Server端的InputChannel注册在由InputManager所管理的InputDispatcher中,而Client端的InputChannel注册在由应用程序主线程的消息循环对象Looper中;
C. 注册在InputDispatcher中的InputChannel由一个反向管道的读端和一个前向管道的写端组成,而注册在应用程序主线程的消息循环对象Looper中的InputChannel由这个前向管道的读端和反向管道的写端组成,这种交叉结构使得当有键盘事件发生时,InputDispatcher可以把这个事件通知给应用程序。
3) InputManager分发键盘消息给应用程序的过程分析
A. 键盘事件发生,InputManager中的InputReader被唤醒,此前InputReader睡眠在/dev/input/event0这个设备文件上;
B. InputReader被唤醒后,它接着唤醒InputManager中的InputDispatcher,此前InputDispatcher睡眠在InputManager所运行的线程中的Looper对象里面的管道的读端上;
C. InputDispatcher被唤醒后,它接着唤醒应用程序的主线程来处理这个键盘事件,此前应用程序的主线程睡眠在Client端InputChannel中的前向管道的读端上;
D. 应用程序处理处理键盘事件之后,它接着唤醒InputDispatcher来执行善后工作,此前InputDispatcher睡眠在Server端InputChannel的反向管道的读端上,注意这里与第二个线索处的区别。
4) 应用程序注销键盘消息接收通道的过程分析
当我们按下键盘上的Back键时,当前激活的Activity窗口就会被失去焦点,但是这时候它还没有被销毁,它的状态被设置为Stopped;当新的Activity窗口即将要显示时,它会通知WindowManagerService,这时候WindowManagerService就会处理当前处理Stopped状态的Activity窗口了,要执行的操作就是销毁它们了,在销毁的时候,就会注销它们之前所注册的键盘消息接收通道。
Android的输入事件,由系统输入事件管理器来统一管理的,对应的服务叫做inputManagerService。
当用户输入键盘或者触摸事件的时候,InputManger负责监控并接收这些事件,然后分发给当前活动的窗口(在创建InputManger对象的时候,其实在c层创建了两个线程InputReader和InputDispatcher,负责监控输入事件和分发事件)。那么怎么分发给当前激活的窗口呢?在activity即将被激活的时候,activity会到InputManger注册一个键盘消息接收通道,activity销毁的时候会注销这个通道,这个注销不是即时的,也就是当下一个activity要显示的时候,会自动注销前面注册的消息通道。
总结:了解触摸/键盘输入事件的基本过程。
用户点击键盘或者触摸屏,会经过InputManager,InputManager的InputReader负责监控读取按键信息,InputDispatcher负责分发事件给当前激活的activity。激活的activity是activity要向inputManager注册一个消息接收通道,当activity销毁时会注销通道。
0 0
- Android的输入事件分发机制笔记
- Android View的事件分发机制笔记
- 【Android学习笔记】Android中View的事件分发机制
- Android的事件分发机制
- Android事件的分发机制
- Android的事件分发机制
- Android 的事件分发机制
- android 事件的分发机制
- Android 的事件分发机制
- Android事件的分发机制
- Android的事件分发机制
- android事件的分发机制
- Android的事件分发机制
- android的事件分发机制
- Android的事件分发机制
- Android的事件分发机制
- Android的事件分发机制
- Android事件的分发机制
- layoutSubviews 调用
- hdu 5410
- 无需Root也能Hook?——Depoxsed框架演示
- 数据库SQL Server2012笔记(六)——修改表、数据的备份和恢复
- JAVA开发类似冒险岛的游戏Part1
- Android的输入事件分发机制笔记
- Codeforces Round #317 [AimFund Thanks-Round] (Div. 1)(组合数学+容斥)
- “对路APP ”新版首推领投+跟投模式 或领中国合投新潮
- MySQL事务隔离级别
- IOS-6-UI知识总结-1(代码添加控件、视图切换、多种传值方式)
- 推荐!国外程序员整理的Java资源大全
- 怎么引客流量???
- stl set 排序
- js-闭包原理