Android灯光系统--深入理解背光灯
一、怎么控制背光灯(简述)
APP将亮度值写入数据库
-
线程检测数据库的值是否发生变化
- 这种机制成为“内容观察者”--contentObserver
二、系统控制背光灯机制
注册LightService
getService(Lights);
根据ID获得背光灯
三、系统初始化流程
创建SystemServer
创建LightService服务
创建电量管理服务PowerManagerService
-
注册内容观察者--ContentObserver
实例化内容观察者
-
注册内容观察
注册了4个Recever(BatteryReceiver、DreamReceiver、UserSwtichedRecever、DockReceiver)
1个contentObserver(屏保、睡眠时屏保启动、连接底座屏保启动、插入并且屏幕开启、屏幕亮度、屏幕亮度模式)
复写内容观察者里面的方法--背光操作onChange();
四、APP层调用系统层的背光灯具体分析
将亮度写入数据库,控制亮度
URI发生变化,自动识别调用ContentObserver中的onChange();方法
调用PowerManagerService.java:handleSettingsChangedLocked();
-
调用PowerManagerService.java:
-> updateSettingsLocked();
- 获得mScreenBrightnessSetting类
-> updatePowerStateLocked();
- updateDisplayPowerStateLocked();更新背光显示电源状态
-
updateDisplayPowerStateLocked();
-> mDisplayPowerRequest.screenBrightness = screenBrightness;获得背光灯请求
-> requestPowerState(mDisplayPowerRequest,
mRequestWaitForNegativeProximity);- sendUpdatePowerStateLocked();发送更新电量状态
-
DisplayPowerController.java--显示器电源管理,相关sensor配合
-> 发送消息,通知updatePowerState();更新能量状态
-> 调用animateScreenBrightness();函数
-> DisplayPowerstate.java
- Screenstate //屏幕状态 - SreenBrightness //屏幕亮度 - ColorFade //屏幕色彩
-> SetScreenBrightness();
-> scheduleScreenUpdate();
- 通过scheduleScreenUpdate来实现的mLocked.notifyALL()唤醒所有进程 - photonicModulator.run(); --线程 - mLock.wait() - setBrightness() - mBackLight.setBrightness(); - setLightLocked(); - jni - hal - device
五、系统背光设置深入分析
总体:Setting -> Dispaly -> Brightness level:BrightnessDialog.java
setting中调节亮度
BrightnessDialog.java
-
findViewID()响应函数
onstart()
registerCallbacks()函数实现
-
mBrightnessObserver.startObserving();
-> registerContentObserver();注册观察者
-> mControl.setOnChangedListener(this);
- 调用onChanged();方法
设置背光灯setBrightness(val); 优化:滑动过程直接调用。结束滑动块时,写入数据库
最终还是调用PowerManagerService.java:updatePowerStateLocked();
附滑块优化代码:
if (!tracking) {
Settings.System.putIntForUser(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS, val,
UserHandle.USER_CURRENT);
}
六、APP实现背光灯调节详细代码
1. 关闭自动调整背光,初始化背光值
try {
//关闭自动调整背光
Settings.System.putInt(getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
brightness = android.provider.Settings.System.getInt(getContentResolver(),
android.provider.Settings.System.SCREEN_BRIGHTNESS); //取出当前数据库的背光灯数字
mLightSeekBar.setProgress(brightness*100/255);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
2. 通过滑块设置屏幕亮度
mLightSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
brightness = seekBar.getProgress(); //取出当前滑块值
brightness = brightness*255/100;
android.provider.Settings.System.putInt(getContentResolver(),
android.provider.Settings.System.SCREEN_BRIGHTNESS,
brightness); //设置屏幕背光亮度
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
});