android4.0 Power、home、menu等按键处理分析

一、Power、HomeMenuback以及Vol+Vol-的处理

我们知道,在WindowManagerService创建的时候会声明一个InputManager的实例,这个InputManager又会通过NativeInit实现将mCallbackslooper等添加到C++中实现创建InputDispatcher和InputReader。然后将这两个实例各加入到InputDispatcherThread和InputReaderThread之中,实现读取输入事件并且进行派发。

1、InputManager.java:

构造函数中有如下实现:

this.mCallbacks=newCallbacks();

这个很关键,它就是在C++层实现回调的方法。然后通过NativeInit添加到C++中去了。

privatefinalclassCallbacks{

publicintinterceptKeyBeforeQueueing(KeyEventevent,intpolicyFlags,boolean

isScreenOn){

returnmWindowManagerService.mInputMonitor.interceptKeyBeforeQueueing(

event,policyFlags,isScreenOn);

}

publicintinterceptMotionBeforeQueueingWhenScreenOff(intpolicyFlags){

returnmWindowManagerService.mInputMonitor.

interceptMotionBeforeQueueingWhenScreenOff(policyFlags);

}

……

}

这些都是通过WindowManagerService调用mPolicy的实现具体功能的函数

2、com_android_server_InputManager.cpp

在android_server_InputManager_nativeInit函数中又有如下操作:

gNativeInputManager=newNativeInputManager(contextObj,callbacksObj,looper);

这里又将InputManager.java中实现的callbacks放到了NativeInputManager中的mCallbacksObj了。

同时构建InputManager:mInputManager=newInputManager(eventHub,this,this);

3、InputManager.cpp

在构造函数中有:

mDispatcher=newInputDispatcher(dispatcherPolicy);

mReader=newInputReader(eventHub,readerPolicy,mDispatcher);

再由

classNativeInputManager:publicvirtualRefBase,

publicvirtualInputReaderPolicyInterface,

publicvirtualInputDispatcherPolicyInterface,

publicvirtualPointerControllerPolicyInterface{

}我们可以知道,InputManager的构造函数的第二个参数实际上就是InputDispatcherPolicyInterface的实现,也就是com_android_server_InputManager的实例。

由InputDispatcher的声明我们知道,这里policy自然就是com_android_server_InputManager了

InputDispatcher::InputDispatcher(constsp<InputDispatcherPolicyInterface>&policy):

mPolicy(policy),

mPendingEvent(NULL),mAppSwitchSawKeyDown(false),mAppSwitchDueTime(LONG_LONG_MAX),

mNextUnblockedEvent(NULL),

mDispatchEnabled(true),mDispatchFrozen(false),mInputFilterEnabled(false),

mCurrentInputTargetsValid(false),

mInputTargetWaitCause(INPUT_TARGET_WAIT_CAUSE_NONE)

在InputReader读取事件之后会唤醒InputDiapatcher函数,之后就开始调用InputDispatcher::notifyKey。详细分析参见:

http://blog.youkuaiyun.com/luoshengyang/article/details/6882903

4、InputDispatcher.cpp

voidInputDispatcher::notifyKey(constNotifyKeyArgs*args){

……

//这里的mPolicy是InputManager

mPolicy->interceptKeyBeforeQueueing(&event,policyFlags);

……

}

5、回到com_android_server_InputManager:

voidNativeInputManager::interceptKeyBeforeQueueing(constKeyEvent*keyEvent,

uint32_t&policyFlags){

if((policyFlags&POLICY_FLAG_TRUSTED)){

if(keyEventObj){

//这里,我们清晰地看到,mCallbacksObj是InputManager.java中的Callbacks了

//也就是调用它的interceptKeyBeforeQueueing了

wmActions=env->CallIntMethod(mCallbacksObj,

gCallbacksClassInfo.interceptKeyBeforeQueueing,

keyEventObj,policyFlags,isScreenOn);

if(checkAndClearExceptionFromCallback(env,"interceptKeyBeforeQueueing")){

wmActions=0;

}

android_view_KeyEvent_recycle(env,keyEventObj);

env->DeleteLocalRef(keyEventObj);

}

}

}

我们回到步骤1的Callbacks定义:

publicintinterceptKeyBeforeQueueing(KeyEventevent,intpolicyFlags,boolean

isScreenOn){

returnmWindowManagerService.mInputMonitor.interceptKeyBeforeQueueing(

event,policyFlags,isScreenOn);

}

InputMonitor.java

publicintinterceptKeyBeforeQueueing(

KeyEventevent,intpolicyFlags,booleanisScreenOn){

returnmService.mPolicy.interceptKeyBeforeQueueing(event,policyFlags,isScreenOn);

}

这里mService是WindowManagerService,mPolicy则是如下定义(WindowManagerService中)

finalWindowManagerPolicymPolicy=PolicyManager.makeNewWindowManager();

PolicyManager.java

publicstaticWindowManagerPolicymakeNewWindowManager(){

//sPolicy就是Policy的实例化

returnsPolicy.makeNewWindowManager();

}

Policy.java

publicWindowManagerPolicymakeNewWindowManager(){

returnnewPhoneWindowManager();

}

至此,正式调用PhoneWindowManager的实例。

因此处理hardkey的相关代码是在PhoneWindowManager中了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值