5.2.3 systemReady分析
下面来分析PMS第三阶段的工作。此时系统中大部分服务都已创建好,即将进入就绪阶段。就绪阶段的工作在systemReady中完成,代码如下:
[—>PowerManagerService.java:systemReady]
void systemReady(){
/*
创建一个SensorManager,用于和系统中的传感器系统交互,由于该部分涉及较多的native层
代码,因此将相关内容放到本丛书后续系列进行讨论
*/
mSensorManager=new SensorManager(mHandlerThread.getLooper());
mProximitySensor=mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
if(mUseSoftwareAutoBrightness){
mLightSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
}
if(mUseSoftwareAutoBrightness){
setPowerState(SCREEN_BRIGHT);
}else{//不考虑软件自动亮度调节,所以执行下面这个分支
setPowerState(ALL_BRIGHT);//设置手机电源状态为ALL_BRIGHT,即屏幕、按键灯都打开
}
synchronized(mLocks){
mDoneBooting=true;
//根据情况启用LightSensor
enableLightSensorLocked(mUseSoftwareAutoBrightness&&mAutoBrightessEnabled);
long identity=Binder.clearCallingIdentity();
try{//通知BatteryStatsService,它将统计相关的电量使用情况,后续再分析它
mBatteryStats.noteScreenBrightness(getPreferredBrightness());
mBatteryStats.noteScreenOn();
}……
}
systemReady主要工作为:
PMS创建SensorManager,通过它可与对应的传感器交互。关于Android传感器系统,将放到本书后续章节讨论。PMS仅仅启用或禁止特定的传感器,而来自传感器的数据将通过回调的方式通知PMS, PMS根据接收到的传感器事件做相应处理。
通过setPowerState函数设置电源状态为ALL_BRIGHT(不考虑UseSoftware-AutoBrightness的情况)。此时屏幕及键盘灯都会点亮。关于setPowrState函数,后文再作详细分析。
调用BatteryStatsService提供的函数,以通知屏幕打开事件,在BatteryStatsService内部将处理该事件。稍后,本章将详细讨论BatteryStatsService的功能。
当系统中的服务都在systemReady中进行处理后,系统会广播一次ACTION_BOOT_COMPLETED消息,而PMS也将处理该广播,下面来具体分析。