5.3.4 WakeLock总结

相信读者此时已经对WakeLock机制有了比较清晰的认识,此处以flags标签为出发点,对WakeLock的知识点进行总结。

如果flags和屏幕有关(除PARTIAL_WAKE_LOCK外),则需要更新屏幕、灯光状态。其中,屏幕操作通过Power类来完成,灯光操作则通过LightService类来完成。

如果FLAGS是PARTIAL_WAKE_LOCK,则需要通过Power提供的接口获取Kernel层的WakeLock。

在WakeLock工作流程中还混杂了用户体验、光传感器、接近传感器等方面的处理逻辑。这部分代码集中体现在setPowerState函数中。感兴趣的读者可进行深入研究。

WakeLock还要通知BatteryStatsService,以帮助其统计电量使用情况。这方面内容放到本章最后分析。

另外,PMS在JNI层也保存了当前屏幕状态信息,这是通过updateNativePowerState-Locked完成的,其代码如下:

[—>PowerManagerService.java:updateNativePowerStateLocked]


private void updateNativePowerStateLocked(){

nativeSetPowerState(//调用native函数,传入两个参数

(mPowerState&SCREEN_ON_BIT)!=0,

(mPowerState&SCREEN_BRIGHT)==SCREEN_BRIGHT);

}

//JNI层实现代码如下

static void android_server_PowerManagerService_nativeSetPowerState(

JNIEnv*env, jobject serviceObj, jboolean screenOn, jboolean screenBright){

AutoMutex_l(gPowerManagerLock);

gScreenOn=screenOn;//屏幕是否开启

gScreenBright=screenBright;//屏幕灯是否全亮

}


PMS的updateNativePowerStateLocked函数曾一度让笔者感到非常困惑,主要原因是初看此函数名,感觉它极可能会和Kernel层的电源管理系统交互。等深入JNI层代码后发现,其功能仅是保存两个全局变量,和Kernel压根儿没有关系。其实,和Kernel层电源管理系统交互的主要是Power类。此处的两个变量是为了方便Native层代码查询当前屏幕状态而设置的,以后分析Android输入系统时就会搞清楚它们的作用了。