Android燈光系統--深入理解背光燈


Android燈光系統--深入理解背光燈

一、怎么控制背光燈(簡述)

  1. APP將亮度值寫入數據庫

  2. 線程檢測數據庫的值是否發生變化

    • 這種機制成為“內容觀察者”--contentObserver

二、系統控制背光燈機制

  1. 注冊LightService

  2. getService(Lights);

  3. 根據ID獲得背光燈

三、系統初始化流程

  1. 創建SystemServer

  2. 創建LightService服務

  3. 創建電量管理服務PowerManagerService

  4. 注冊內容觀察者--ContentObserver

    • 實例化內容觀察者

    • 注冊內容觀察

      • 注冊了4個Recever(BatteryReceiver、DreamReceiver、UserSwtichedRecever、DockReceiver)

      • 1個contentObserver(屏保、睡眠時屏保啟動、連接底座屏保啟動、插入並且屏幕開啟、屏幕亮度、屏幕亮度模式)

    • 復寫內容觀察者里面的方法--背光操作onChange();

四、APP層調用系統層的背光燈具體分析

  1. 將亮度寫入數據庫,控制亮度

  2. URI發生變化,自動識別調用ContentObserver中的onChange();方法

  3. 調用PowerManagerService.java:handleSettingsChangedLocked();

  4. 調用PowerManagerService.java:

    -> updateSettingsLocked();

    - 獲得mScreenBrightnessSetting類
    

    -> updatePowerStateLocked();

    - updateDisplayPowerStateLocked();更新背光顯示電源狀態
    
  5. updateDisplayPowerStateLocked();

    -> mDisplayPowerRequest.screenBrightness = screenBrightness;獲得背光燈請求

    -> requestPowerState(mDisplayPowerRequest,
    mRequestWaitForNegativeProximity);

    - sendUpdatePowerStateLocked();發送更新電量狀態 
    
  6. 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中調節亮度

  1. BrightnessDialog.java

  2. findViewID()響應函數

    • onstart()

    • registerCallbacks()函數實現

  3. mBrightnessObserver.startObserving();

    -> registerContentObserver();注冊觀察者

    -> mControl.setOnChangedListener(this);

    - 調用onChanged();方法
    
  4. 設置背光燈setBrightness(val); 優化:滑動過程直接調用。結束滑動塊時,寫入數據庫

  5. 最終還是調用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) {

            }

        });


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM