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) {
}
});