Android4.4 DisplayPowerState.java PhotonicModulator
PhotonicModulator是DisplayPowerState的内部类,private final class,所以实例只有一个,
在DisplayPowerState的构造方法中:mPhotonicModulator = new PhotonicModulator();
它的作用:Updates the state of the screen and backlight asynchronously on a separate thread. 异步更新screen和backlight
下面是流程图:
如何设置screenOn和backlight是由三个值决定:
DisplayPowerState.java的boolean mScreenOn、float mElectronBeamLevel、int mScreenBrightness
要注意这里的Handler是异步的:mHandler = new Handler(true /*async*/);
一个标准的设置screen为off的log如下:
D/PowerManagerDisplayState( 693): Requesting new screen state: on=false, backlight=0, mChangeInProgress=false
D/PowerManagerDisplayState( 693): on mTask
D/PowerManagerDisplayState( 693): mTask: on = false, mActualOn = true, backlight = 0, mActualBacklight = 0
D/PowerManagerDisplayState( 693): mTask: on = false, onChanged = true, backlightChanged = false, backlight = 0
D/PowerManagerService( 693): blankAllDisplays in ...
D/PowerManagerService( 693): blankAllDisplays ...
D/PowerManagerService( 693): blankAllDisplays out ...
D/PowerManagerDisplayState( 693): mTask: on = false, mActualOn = false, backlight = 0, mActualBacklight = 0
DisplayBlanker的唯一实现是在PowerManagerService.java中:
private final class DisplayBlankerImpl implements DisplayBlanker
mBacklight是DisplayPowerController中创建DisplayPowerState实例时传入的:
LightsService mLights;
mLights.getLight(LightsService.LIGHT_ID_BACKLIGHT)
LightsService.java
private final Light mLights[] = new Light[LIGHT_ID_COUNT];
public static final int LIGHT_ID_BACKLIGHT = 0;
public static final int LIGHT_ID_KEYBOARD = 1;
public static final int LIGHT_ID_BUTTONS = 2;
public static final int LIGHT_ID_BATTERY = 3;
public static final int LIGHT_ID_NOTIFICATIONS = 4;
public static final int LIGHT_ID_ATTENTION = 5;
public static final int LIGHT_ID_BLUETOOTH = 6;
public static final int LIGHT_ID_WIFI = 7;
public static final int LIGHT_ID_COUNT = 8;
这里有很多light,我们只得到了其中的backlight这个。
未完待续......