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

Android灯光系统--深入理解背光灯的更多相关文章

  1. 8.6 Android灯光系统_源码分析_背光灯

    Change system screen brightness, using android.provider.Settings.System.SCREEN_BRIGHTNESSandroid-er. ...

  2. 8.1 Android灯光系统_总体框架

    1.框架 APP(java语言实现) ------------------------------- JNI(c++语言实现)     向上提供Java执行c函数的接口  向下访问HAL ------ ...

  3. Android灯光系统--通知灯深入分析【转】

    本文转自:https://www.cnblogs.com/lkq1220/p/6406261.html Android灯光系统--通知灯深入分析 通知的类别 声音 振动 闪灯 APP如何发出通知灯请求 ...

  4. Android灯光系统框架分析【转】

    本文转载自: 首先别人的APP要能直接访问到你写的硬件或者不经过任何修改的APP能直接使用你的驱动,就需要使用系统自带的JNI,所以我们需要写出符合系统自带JNI文件的HAL文件和驱动程序,下面具体分 ...

  5. Android灯光系统--通知灯深入分析

    Android灯光系统--通知灯深入分析 通知的类别 声音 振动 闪灯 APP如何发出通知灯请求 getSystemService(获得通知服务) 构造notification 类别 其他参数(颜色, ...

  6. 8.3 Android灯光系统_编写HAL_lights.c

    注意在led-classes.c中定义的led_class_attrs[]所建立的文件的属性应该改为0666,否则应用程序无权操作它 同时ledtrig-time.c里面对应新建的那几个delay_o ...

  7. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解

    原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...

  8. Android动画的理解

    基础知识 在我们开始讲Android动画这个知识点之前,我们了解下相应的基础知识点. Shape篇 一般用Shape定义的XML文件是存放在Drawable目录下,广泛应用于在Button.TextV ...

  9. 〖Linux〗Ubuntu13.10中打开键盘背光灯

    刚刚从淘宝上买回一个带有Led背光的键盘(黑爵战神x5 背光升级版): 然后发现在Linux中背光灯并不亮,在Windows中就可以按下Scroll Lock键点亮: 在网上探索了一番,觉得应该可以使 ...

随机推荐

  1. MySQL常用命令总结3

    id SMALLINT UNSIGNED [AUTO_INCREMENT] PRIMARY KEY, //把id定义为主键且自动排号,每张数据表只有一个主键,不能为NULL,确保记录唯一性 //省略a ...

  2. linux下配置ip地址四种方法(图文)

    (1)Ifconfig命令   第一种使用ifconfig命令配置网卡的ip地址.此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效.具体用法如下.Ipconfig  ethx   i ...

  3. Mybatis 模糊查询 中文问题

    IDE编码:GBK ,换成UTF-8也不行! @Testpublic void testSearchStudents() {logger.info("查询学生(带条件)");Map ...

  4. ucos任务调度原理及任务就绪表

    之前我们说到,系统在运行的时候会直接依靠任务的优先级来找到任务的控制块从而实现任务的调用切换等功能,那么接下来的问题就是,系统是怎么找到并确定某一个特定的最高优先级任务并确定他的优先级的呢 为了解决这 ...

  5. Phone APP设计规范/iPad APP设计规范/Android APP设计规范/网页设计规范

    原文链接:http://www.ui001.com/chicun/ ①iPhone的设计尺寸 iPhone界面尺寸: 设备 分辨率 状态栏高度 导航栏高度 标签栏(工具栏)高度 iPhone6 plu ...

  6. FIFO存储器

    FIFO( First In First Out)简单说就是指先进先出.由于微电子技术的飞速发展,新一代FIFO芯片容量越来越大,体积越来越小,价格越来越便宜.作为一种新型大规模集成电路,FIFO芯片 ...

  7. 学习tabhost 实现微博的主界面

    2014-05-27 吴文付 微博的主界面还是很漂亮的,我们这里来熟悉下tabhost的使用, 网上资料很多,主要参考了:http://blog.csdn.net/shulianghan/articl ...

  8. Mybatis oracle多表联合查询分页数据重复的问题

    Mybatis oracle多表联合查询分页数据重复的问题 多表联合查询分页获取数据时出现一个诡异的现象:数据总条数正确,但有些记录多了,有些记录却又少了甚至没了.针对这个问题找了好久,最后发现是由于 ...

  9. UVa 594 - One Little, Two Little, Three Little Endians

    题目大意:大小端模式的转换.所谓的小端模式,是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中.与此相对,所谓的大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内 ...

  10. imageX批量安裝windows7

    以一臺電腦爲sample,安裝完成windows os及其全部update,安裝全部常用軟件,打印機驅動,網絡磁碟機等. 關閉安全控制"UAC"和"維護解決方案" ...