android input 事件传递主要流程

1.  WindowManagerService

frameworks/base/services/java/com/android/server/WindowManagerService.java

依赖 InputManager  mInputManager;   
在初始化的时候生成,并mInputManager.start() 启动

 

2. InputManager

frameworks/base/services/java/com/android/server/InputManager.java

a. new  InputManager()

--->nativeInit(mcallbak)     //初始化InputManager,并注册输入事件的回调函数

  ---> android_server_InputManager_nativeInit ()   // frameworks/base/services/jni/com_android_server_InputManager.cpp

        ---> NativeInputManager()     // frameworks/base/services/jni/com_android_server_InputManager.cpp

             ---> InputManager()  //  frameworks/base/libs/ui/InputManager.cpp

               ---->    初始化DispatcherThread 和 ReaderThread 两个线程

                         mReaderThread = new InputReaderThread(mReader);     // InputReader 循环loop EventHub
                         mDispatcherThread = new InputDispatcherThread(mDispatcher);

 

b. InputManager.start()

 --- > android_server_InputManager_nativeStart    //frameworks/base/services/jni/com_android_server_InputManager.cpp

      -->启动DispatcherThread 和 ReaderThread 两个线程

 

3.  InputReader   //获取一次event事件

frameworks/base/libs/ui/InputReader.cpp 

InputReader::loopOnce()

 ---> EventHub.getEvent()

 

4. InputManager.java  的mCallbacks    //输入事件的回调处理函数InputManager.Callbacks内部类

InputDispatcher::notifyKey 回调NativeInputManager方法并通过jni 的方式回调InputManager.java  的mCallbacks   进行事件的处理

如:InputDispatcher::notifyKey  ----> InputManager.CallbacksinterceptKeyBeforeQueueing()

//frameworks/base/services/jni/com_android_server_InputManager.cpp

 

5. InputManager.Callbacks内部类

a. 回调WindowManagerService的WindowManagerService.InputMonitor类的方法进行事件的处理.

b. InputMonitor 调用 WindowManagerService的成员mPolicy

c. mPolicy 是WindowManagerPolicy的对象,实际是com.android.internal.policy.impl.Policy 创建出来的PhoneWindowManager

  // PhoneWindowManager.java

 

6. PhoneWindowManager.java

a. interceptKeyBeforeDispatching()      home事件的截取

b. interceptKeyBeforeQueueing()          power等按键的截取

 

7. InputReader.cpp

InputReader::process()

 ---> InputReader::consumeEvent()

      ---> InputDevice::process()

         ---> KeyboardInputMapper::process() //或者 TrackballInputMapper::process() 或者 TouchInputMapper::process()
           --->KeyboardInputMapper::processKey()
              ----> InputDispatcher::notifyKey()
                 --->WindowManagerPolicy::interceptKeyBeforeQueueing() //即对应6中的,前期对事件的处理
                     InputDispatcher::enqueueInboundEventLocked()
                       ---> mInboundQueue.enqueueAtTail(entry); // 将按键事件添加到InputDispatcher的消息队列中
                            如果队列原来是空的,则唤醒InputDispatcherThread进程
 
8. InputDispatcherThread
-->InputDispatcher::dispatchOnce()    
   --> InputDispatcher::dispatchOnceInnerLocked()
      --> InputDispatcher::dispatchKeyLocked()
        --> InputDispatcher::findFocusedWindowTargetsLocked()
            InputDispatcher::dispatchEventToCurrentInputTargetsLocked()
             --> InputDispatcher::prepareDispatchCycleLocked()
                 -->InputDispatcher::startDispatchCycleLocked()
                    --> InputPublisher::publishKeyEvent()      
                        --> NativeInputQueue::handleReceiveCallback
                            --> java 层的InputQueue的dispatchKeyEvent() 方法
                               --> ViewRoot的dispatchKeyEvent() 方法

               

参考:

http://blog.csdn.net/yuleslie/article/details/7079448

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值