android input系列文章
由浅入深学习android input系统(一) - input事件如何传递到View
由浅入深学习android input系统(二) - input事件如何传递到app进程( InputDispatcher )
由浅入深学习android input系统(三) - InputChannel解析
由浅入深学习android input系统(四) - input事件采集(InputReader)
由浅入深学习android input系统(五) - input系统的启动

概述

前文已经讲过了input系统对事件的抓取以及传递,此文将探索下input系统的启动。

前文:由浅入深学习android input系统(四) - input事件采集(InputReader)

input系统的初始化

调用的任务栈如下:

  • SystemServer.main()
  • SystemServer.run()
  • InputManagerService构造函数
  • InputManagerService.nativeInit()
  • com_android_server_input_InputManagerService.nativeInit()
  • NativeInputManager构造函数
  • InputManager构造函数

InputManager构造函数中初始化了两部分:

  1. 初始化InputReader与InputDispatcher
  2. 初始化InputReaderThread与 InputDispatcherThread
InputManager::InputManager(const sp<InputReaderInterface>& reader,const sp<InputDispatcherInterface>& dispatcher) :mReader(reader),mDispatcher(dispatcher) {initialize();
}
void InputManager::initialize() {mReaderThread = new InputReaderThread(mReader);mDispatcherThread = new InputDispatcherThread(mDispatcher);
}

input系统的启动

调用的任务栈如下:

  • SystemServer.main()
  • SystemServer.run()
  • InputManagerService.start()
  • InputManagerService.nativeStart()
  • com_android_server_input_InputManagerService.nativeStart()
  • InputManager.stat()

InputManager的start()方法中分别启动了InputReaderThread与InputDispatcherThread。

status_t InputManager::start() {status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);if (result) {ALOGE("Could not start InputDispatcher thread due to error %d.", result);return result;}result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);if (result) {ALOGE("Could not start InputReader thread due to error %d.", result);mDispatcherThread->requestExit();return result;}return OK;
}

InputReaderThread

要点如下:

  • 运行了run()方法后,最终会执行到threadLoop()方法,这个方法只有在执行requestExit()后才会停止循环
  • threadloop()中执行了InputReader.loopOnce()方法,开始接收硬件的事件。

对InputReader.loopOnce()的内容由兴趣的读者可以看下前面的文章:


InputReaderThread::InputReaderThread(const sp<InputReaderInterface>& reader) :Thread(/*canCallJava*/ true), mReader(reader) {
}InputReaderThread::~InputReaderThread() {
}bool InputReaderThread::threadLoop() {mReader->loopOnce();return true;
}

InputDispatcherThread

要点如下:

  • 运行了run()方法后,最终会执行到threadLoop()方法,这个方法只有在执行requestExit()后才会停止循环
  • threadloop()中执行了InputDispatcher.dispatchOnce()方法,开始分发从InputReader那边接收的事件。

对InputDispatcher.dispatchOnce()的内容由兴趣的读者可以看下前面的文章:

InputDispatcherThread::InputDispatcherThread(const sp<InputDispatcherInterface>& dispatcher) :Thread(/*canCallJava*/ true), mDispatcher(dispatcher) {
}InputDispatcherThread::~InputDispatcherThread() {
}bool InputDispatcherThread::threadLoop() {mDispatcher->dispatchOnce();return true;
}

由浅入深学习android input系统(五) - input系统的启动相关推荐

  1. 由浅入深 学习 Android Binder(十一) binder线程池

    Android Binder系列文章: 由浅入深 学习 Android Binder(一)- AIDL 由浅入深 学习 Android Binder(二)- bindService流程 由浅入深 学习 ...

  2. 由浅入深 学习 Android Binder(一)- AIDL

    Android Binder系列文章: 由浅入深 学习 Android Binder(一)- AIDL 由浅入深 学习 Android Binder(二)- bindService流程 由浅入深 学习 ...

  3. Android 网页h5 Input选择相机和系统相册

    需求: 网页h5的input选择相机和系统相册,并且返回压缩的图片到h5. 代码: 1.WebView代码 package com.zql.sdk;import android.app.Activit ...

  4. 解决 input 输入框在 iOS 系统中无法输入内容

    问题 input 输入框在 Android 系统可以输入和点击,但是在 iOS 系统上 input 输入框无法点击和输入. 解决方法 方案一:在代码中查找并去掉下列样式 -webkit-touch-c ...

  5. Android菜鸟如何学习Android系统开发?

    如何做好Android学习前的准备? 如果你已经确定了学习Android的目标,那么,应该提前做好哪些工作.先打下哪些基础呢? 首先,你最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类 ...

  6. Android菜鸟如何学习Android系统开发?(

    如何做好Android学习前的准备? 如果你已经确定了学习Android的目标,那么,应该提前做好哪些工作.先打下哪些基础呢? 首先,你最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类 ...

  7. Android Studio的学习相关--推荐几个可以系统学习Android的网站

    推荐几个可以系统学习Android的网站 廖雪峰的官方网站:Java教程 Android 开发者:Android Studio用户指南 AndroidDevTools 菜鸟教程:Android基础入门 ...

  8. ios与mac系统,input输入时,自带的输入法会出现重复显示问题

    问题:ios与mac系统,input输入时,自带的输入法会出现重复显示问题 解决方法:以不允许输入表情为例 需要为安卓及ios进行兼容处理 先区分系统再调用对应方法 ios: // ios不让输入表情 ...

  9. IOS系统中input标签获取焦点页面会放大的问题

    IOS系统中input标签获取焦点页面会放大的问题 在iOS系统中打开网页,input框输入时,输入框获取焦点的时候页面会放大,如果没有经过设置,页面放大之后就不会自动还原.使内容撑开浏览器,底部产生 ...

  10. Google Filament 源码学习(六):Material System (五) - 材质系统框架

    目录 Introduction Filament 工程简化 删除 Filament 工程中非核心内容 根目录保留 build文件夹中保留 filament文件夹中保留 libs文件夹中保留 third ...

最新文章

  1. JSON.parse()与JSON.stringify()的区别
  2. Python中的高效的集合操作
  3. winform响应时间最长是多少分钟_了解这个,你的爬升勋章分分钟手到擒来!
  4. numpy均匀分布_Python计算类库(Numpy)
  5. SAP两款CRM产品各方面比较:SAP CRM vs SAP Cloud for Customer
  6. springboot + redis
  7. 单例模式(Java)
  8. Transfomer入门:Self-attention + Multi-head Self-attention
  9. 外威客外包网站Elance
  10. 6_python基础—循环
  11. 加入rtp组播_耗时10+小时撰写 带你系统认识组播 收藏这些概念
  12. 【信号与系统】信号频谱和测量之汉明窗
  13. python统计形容词权重然后排序
  14. CSS 引入的三种方式
  15. javaweb_util_excel模板横向纵向循环
  16. EMV技术学习和研究(一)开篇
  17. 雨伞16骨好还是24骨好_伞骨什么材质好 晴雨伞骨数越多越好吗
  18. android 8.0 屏蔽首次开机弹出的‘即将完成 Android 更新’的弹窗
  19. 博客园电子期刊2012年9月刊发布啦
  20. 黑客攻击-程序破解(1)

热门文章

  1. android的wifi开发码源,亚美电游app下载 -官方网站
  2. 用vue-cli3导入外部的iconfont.css图标样式遇到的坑:These relative modules were not found:...
  3. php 逻辑思维题,倘若3分钟内,你能答对这道智力题,说明你的逻辑思维能力很强...
  4. linux后门rootkit程序介绍
  5. python中dispatch_在django,dispatch的用途是什么?
  6. IE7绿色版下载-转载
  7. pack_padded_sequence torch说明
  8. php更改文件为只读,word只读模式怎么修改
  9. 大厂面试预备篇——《两万字MySql基础总结》❤️建议收藏
  10. 文件截取\裁剪工具软件