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

            }

        });

posted @ 2017-02-16 20:30  lkq1220  阅读(3707)  评论(0编辑  收藏  举报