android添加input事件,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值