Step 15. Looper.pollOnce

这个函数定义在frameworks/base/libs/utils/Looper.cpp文件中,具体可以参考前面Android应用程序消息处理机制(Looper、Handler)分析一文,这里就不再详述了。总的来说,就是在Looper类中,会创建一个管道,当调用Looper类的pollOnce函数时,如果管道中没有内容可读,那么当前线程就会进入到空闲等待状态;当有键盘事件发生时,InputReader就会往这个管道中写入新的内容,这样就会唤醒前面正在等待键盘事件发生的线程。

InputDispatcher类分发消息的过程就暂时分析到这里,后面会有更进一步的分析,现在,我们回到Step 12中,接着分析InputReader类读取键盘事件的过程。在调用了InputReaderThread线程类的run就函数后,同样会进入到InputReaderThread线程类的threadLoop函数中去。

Step 16. InputReaderThread.threadLoop

这个函数定义在frameworks/base/libs/ui/InputReader.cpp文件中:

  1. bool InputReaderThread::threadLoop() {
  2. mReader->loopOnce();
  3. return true;
  4. }

这里的成员变量mReader即为在前面Step 8中创建的InputReader对象,调用它的loopOnce成员函数执行一次键盘事件的读取操作。

Step 17. InputReader.loopOnce

这个函数定义在frameworks/base/libs/ui/InputReader.cpp文件中:

  1. void InputReader::loopOnce() {
  2. RawEvent rawEvent;
  3. mEventHub->getEvent(& rawEvent);
  4. #if DEBUG_RAW_EVENTS
  5. LOGD("Input event: device=0x%x type=0x%x scancode=%d keycode=%d value=%d",
  6. rawEvent.deviceId, rawEvent.type, rawEvent.scanCode, rawEvent.keyCode,
  7. rawEvent.value);
  8. #endif
  9. process(& rawEvent);
  10. }

这里通过成员函数mEventHub来负责键盘消息的读取工作,如果当前有键盘事件发生或者有键盘事件等待处理,通过mEventHub的getEvent函数就可以得到这个事件,然后交给process函数进行处理,这个函数主要就是唤醒前面的InputDispatcherThread线程,通知它有新的键盘事件发生了,它需要进行一次键盘消息的分发操作了,这个函数我们后面再进一步详细分析;如果没有键盘事件发生或者没有键盘事件等待处理,那么调用mEventHub的getEvent函数时就会进入等待状态。

转载于:https://blog.51cto.com/shyluo/966612

Android应用程序键盘(Keyboard)消息处理机制分析(3)相关推荐

  1. Android系统中的Binder通信机制分析(7)- Java 层的 Binder 机制

    声明 其实对于Android系统Binder通信的机制早就有分析的想法,记得2019年6.7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾- 文中参考 ...

  2. Android应用程序键盘(Keyboard)消息处理机制分析(12)

    Step 12. InputChannel.openInputChannelPair 这个函数定义在frameworks/base/core/java/android/view/InputChanne ...

  3. Android应用程序线程消息循环模型分析(5)

      从AsyncTask的实现可以看出,当我们第一次创建一个AsyncTask对象时,首先会执行下面静态初始化代码创建一个线程池sExecutor: private static final Bloc ...

  4. Android应用程序线程消息循环模型分析

    出自:http://blog.csdn.net/luoshengyang/article/details/6905587 我们知道,Android应用程序是通过消息来驱动的,即在应用程序的主线程(UI ...

  5. 以下未发布-Android的多线程以及异步消息处理机制,android移动开发基础案例教程源码

    1.Message: Message 是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间进行数据交换.除了 what 字段,还可以使用 arg1 和 arg2 来携带整型数据,使用 ...

  6. Android应用程序键盘(Keyboard)消息处理机制分析(20)

    Step 24. InputQueue.dispatchKeyEvent 这个函数定义在frameworks/base/core/java/android/view/InputQueue.java文件 ...

  7. Android应用程序键盘(Keyboard)消息处理机制分析(26)

    Step 7. LocalWindowManager.removeViewImmediate 这个函数定义在frameworks/base/core/java/android/view/Window. ...

  8. Android应用程序键盘(Keyboard)消息处理机制分析(17)

    Step 11. InputDispatcher.dispatchOnceInnerLocked 这个函数定义在frameworks/base/libs/ui/InputDispatcher.cpp文 ...

  9. Android应用程序键盘(Keyboard)消息处理机制分析(14)

    3. InputManager分发键盘消息给应用程序的过程分析 在分析InputManager分发键盘消息给应用程序的过程之前,我们先假设现在没有键盘事件发生,因此,InputManager中的Inp ...

最新文章

  1. 【面试题】Spring,SpringMVC,SpringBoot,SpringCloud有什么区别和联系?
  2. 정규식 문법 정리.초급
  3. 602. Friend Requests II: Who Has Most Friend?
  4. MyCat全局序列之数据库方式
  5. CF984B Minesweeper
  6. 搭建Ubuntu下c/c++编译环境
  7. 宁录哨兵机器人_漫威漫画里奥创、灭霸、哨兵机器人、天启谁更厉害?
  8. JavaScript复习二
  9. 如何在网上轻松赚钱,三个非常靠谱的副业项目,一定要收藏起来看
  10. Redis的五种基础数据结构和三种高级数据结构
  11. 稍微好看点的登录页面html
  12. oracle中转换函数,Oracle中的转换函数
  13. python中set如何添加元素_python中如何在set中添加元素?语句是什么
  14. 网络课笔记整理——物理层
  15. 信息学奥赛一本通(c++):1000:入门测试题目
  16. 从快递到电商,顺丰在谋划什么?
  17. 蓝牙-基础篇-蓝牙简介
  18. redis作为MongoDB的缓存在线实时去重
  19. AP微积分全方位解析
  20. 基于ssm的志愿者管理系统(idea+spring+springmvc+mybatis+jsp)

热门文章

  1. git 常用命令整理
  2. VMware系列:将物理机热迁移到ESXi中(必藏喔)
  3. H5移动端网页标签模板
  4. 怎么样用javascript获取触发事件的对象
  5. mysql版本 时间_【MySQL】MySQL版本时间线和MySQL各版本的区别
  6. SESSION 页面刷新 失效
  7. .net平台下C#socket通信(中)
  8. Request.From,Request.QueryString转对象
  9. luogu p1459 三值的排序
  10. Uva 11464 偶数矩阵