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输入系统时就会搞清楚它们的作用了。