input 之我见1

  1. InputMangerService是怎么产生的?
base/services/java/com/android/server/SystemServer.java            Slog.i(TAG, "Input Manager");                                                                                                                            inputManager = new InputManagerService(context, wmHandler);

InputManagerService的代码位于

frameworks/base/services/java/com/android/server/input/InputManagerService.java
  1. 一开机的时候, SystemServer 会启动 InputManagerService, 这时 InputManagerService 又会去启动两个Thread,InputReaderThread,InputDispatcherThread和一个 EventHubInterface .

如何来生成两个Thread?

InputManagerSerivice.java中的构造函数InputManagerService()->nativeInit()->com_android_server_input_InputManagerService.cppnativeInit()->new NativeInputManager()->new InputManager()->framework/native/service/inputflinger(androidL)InputManager::InputManager(        const sp& eventHub,        const sp& readerPolicy,        const sp& dispatcherPolicy) {    mDispatcher = new InputDispatcher(dispatcherPolicy);    mReader = new InputReader(eventHub, readerPolicy, mDispatcher);    initialize();}=>void InputManager::initialize() {    mReaderThread = new InputReaderThread(mReader);    mDispatcherThread = new InputDispatcherThread(mDispatcher);}以InputReaderThread为例InputReader.cppInputReaderThread::InputReaderThread(const sp& reader) :        Thread(/*canCallJava*/ true), mReader(reader) {}InputReaderThread::~InputReaderThread() {}bool InputReaderThread::threadLoop() {    mReader->loopOnce();//这里的mReader就是InputReader的实例    return true;}->void InputReader::loopOnce() {...size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);//EventHubInterface,getEvents就是读driver的/dev目录...}其中,这个线程有一个非常重要的函数getEvents,就是这个线程主要的工作getEvents(){...for(; ;){...readNotifyLocked()...}}会不停的读系统输入设备的状态。}
  1. 因此输入事件处理流程跟此三位角色有关系.InputReaderThread从EventHubInterface抓取新的inputevent, 然后在依各个的eventtype 进入各个的 event mapper, 各个的 event mapper 处理输入事件完之后,InputReaderThread 将new input 放进 Queue 中. 之后 InputDispatcherThread再从Queue中取出Input Event 放入共享内存中. 此时再通知 View 去共享内存抓取 new Input Event, 取完之后再通知InputDispatcherThread是否可以再放新的InputEvent到共享内存中,

    这段话这样解释。

input 之我见1_第1张图片

更多相关文章

  1. C语言函数以及函数的使用
  2. android 建数据库 SQLite 存储sd 卡或者内存
  3. android 主线程和子线程之间的消息传递
  4. [Android Studio] Android Studio如何提示函数用法
  5. android编程之在单线程模型中Message、Handler、Message Queue、
  6. Android获取SD卡路径/内存的几种方法
  7. Android 进程和线程模型 .

随机推荐

  1. Android跨进程通信IPC之9——Binder之Fra
  2. 老罗Android开发视频教程 (android解析xml
  3. android:gravity / android:layout_Gravi
  4. Android中margin和padding的区别
  5. Android(安卓)xml资源文件中@、@android:
  6. Android学习笔记 - 控件篇
  7. 做Android的感想
  8. EditText部分属性使用
  9. Android标题栏、状态栏、全屏
  10. android Android(安卓)build.gradle 配置