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也将处理该广播,下面来具体分析。