按键的处理属于本书后面要分析的输入系统的范围。 在此,我们将检索与电源键相关的代码进行分析。 代码如下所示。
* com _ Android _ server _ input manager.CPP :3360 handleinterceptactions * *
~~~
voidnativeinputmanager :3360 handleinterceptactions (jintwmactions,nsecs_t when,
uint32_t policyFlags ) {
当按下并松开Power键时,wmActions被设置为WM_ACTION_GO_TO_SLEEP,表示需要休眠
wmactionswm _ action _ go _ to _ sleep (if ) {
//利用JNI调用PMS的goToSleep函数
Android _ server _ power manager service _ goto sleep (when;
}
//在常见输入事件中调用userActivity函数,启动手机
wmactionswm _ action _ poke _ user _ activity (if ) {
利用//JNI调用PMS的用户活动函数。 相关内容在前一节进行了分析
Android _ server _ power manager service _ user activity (
POWER_MANAGER_BUTTON_EVENT;
}
.//其他处理
}
~~~
从上面的代码注释中可以看出,按下并释放Power键时,[^write]将调用触发PMS的goToSleep函数。 让我们看看goToSleep函数的代码。
* power manager service.Java :3360 goto sleep * *
~~~
公共时间(long time ) )。
{
gotosleepwithreason(time,windowmanagerpolicy.off _ because _ of _ user );
}
publicvoidgotosleepwithreason (长时间,intreason ) )。
{
m context.enforcecallingorselfpermission (/检查调用进程是否具有DEVICE_POWER权限
Android.manifest.permission.device _ power,null;
同步(mlocks ) {
gotosleeplocked(time,reason ); 调用goToSleepLocked函数
}
}
~~~
* power manager service.Java :3360 gotosleeplocked * *
~~~
privatevoidgotosleeplocked (long time,intreason ) {
最大事件时间=时间(if ) {
mLastEventTime=time;
mWakeLockState=SCREEN_OFF;
int N=mLocks.size (;
intnumCleared=0;
布尔专业xlock=false;
for(intI=0; I
welockwl=mlocks.get(I;
is screen lock (wl.flags ) ) }
if () (wl.flagslock_mask )=
power manager.proximity _ screen _ off _ wake _ lock )
reason==windowmanagerpolicy.off _ because _ of _ prox _ sensor ) {
proxLock=true; 确定goToSleep的原因是否与接近传感器有关
} else{
mlocks.get(I ).activated=false; //禁止屏幕相关的WakeLock
numCleared;
}
}//isScreenLock判断结束
}//for周期结束
if (! proxLock
mproxignoredbecausescreenturnedoff=true;
}
mstillneedsleepnotification=true;
mUserState=SCREEN_OFF;
setpowerstate(screen_off,false,reason ); //关闭画面
cancelTimerLocked 从mHandler中取消mTimeoutTask任务
}
}
~~~
掌握了前面的基础知识后,感觉电源键的处理流程真的很简单,读者也有同感吗?
[^write]:必须在一定时间内完成按下或松开电源键的操作。 否则,系统会认为是关机操作。 详细内容输入卷系统章的分析。