zoukankan      html  css  js  c++  java
  • 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) {
    
                }
    
            });
    
    
  • 相关阅读:
    spring boot使用自定义注解+AOP实现对Controller层指定方法的日志记录
    spring事务管理中,注解方式和xml配置方式优先级谁高?
    synchronized修饰类中不同方法,调用的时候方法互斥吗
    java(spring boot)实现二维码生成(可以插入中间log和底部文字)
    java借助Robot给微信好友自动发消息(可发送表情包)
    js中Map类型的使用
    【转】Intellij笔记
    Tomcat6.0webappsevopWEB-INFclasses (系统找不到指定的路径)
    多线程多进程之其他
    文件操作
  • 原文地址:https://www.cnblogs.com/lkq1220/p/6407474.html
Copyright © 2011-2022 走看看