Android灯光系统--深入理解背光灯
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) {
}
});
Android灯光系统--深入理解背光灯的更多相关文章
- 8.6 Android灯光系统_源码分析_背光灯
Change system screen brightness, using android.provider.Settings.System.SCREEN_BRIGHTNESSandroid-er. ...
- 8.1 Android灯光系统_总体框架
1.框架 APP(java语言实现) ------------------------------- JNI(c++语言实现) 向上提供Java执行c函数的接口 向下访问HAL ------ ...
- Android灯光系统--通知灯深入分析【转】
本文转自:https://www.cnblogs.com/lkq1220/p/6406261.html Android灯光系统--通知灯深入分析 通知的类别 声音 振动 闪灯 APP如何发出通知灯请求 ...
- Android灯光系统框架分析【转】
本文转载自: 首先别人的APP要能直接访问到你写的硬件或者不经过任何修改的APP能直接使用你的驱动,就需要使用系统自带的JNI,所以我们需要写出符合系统自带JNI文件的HAL文件和驱动程序,下面具体分 ...
- Android灯光系统--通知灯深入分析
Android灯光系统--通知灯深入分析 通知的类别 声音 振动 闪灯 APP如何发出通知灯请求 getSystemService(获得通知服务) 构造notification 类别 其他参数(颜色, ...
- 8.3 Android灯光系统_编写HAL_lights.c
注意在led-classes.c中定义的led_class_attrs[]所建立的文件的属性应该改为0666,否则应用程序无权操作它 同时ledtrig-time.c里面对应新建的那几个delay_o ...
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解
原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...
- Android动画的理解
基础知识 在我们开始讲Android动画这个知识点之前,我们了解下相应的基础知识点. Shape篇 一般用Shape定义的XML文件是存放在Drawable目录下,广泛应用于在Button.TextV ...
- 〖Linux〗Ubuntu13.10中打开键盘背光灯
刚刚从淘宝上买回一个带有Led背光的键盘(黑爵战神x5 背光升级版): 然后发现在Linux中背光灯并不亮,在Windows中就可以按下Scroll Lock键点亮: 在网上探索了一番,觉得应该可以使 ...
随机推荐
- 企业证书APP发布流程
企业发布app的 过程比app store 发布的简单多了,没那么多的要求,哈 但是整个工程的要求还是一样,比如各种像素的icon啊 命名规范啊等等. 下面是具体的流程 1.修改你的 bundle i ...
- iOS UICollectionView高级用法(长按自由移动cell)-新
[reference]http://www.jianshu.com/p/31d07bf32d62 iOS 9之后: 示例如下 效果 前言: 看完你可以学到哪些呢? 就是文章标题那么多, 只有那么多. ...
- Java程序员常犯的10个错误
本文总结了Java程序员常犯的10个错误. #1. 把Array转化成ArrayList 把Array转化成ArrayList,程序员经常用以下方法: List<String> lis ...
- TCP/IP详解--拥塞控制 & 慢启动 快恢复 拥塞避免
TCP的拥塞控制 1. 拥塞:即对资源的需求超过了可用的资源.若网络中许多资源同时供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而下降. 拥塞控制:防止过多的数据注入到网络中,这样 ...
- UVa 727 - Equation
题目大意:给一个中缀表达式,转换成后缀表达式. 这类题一直不太会,让我想就是建一棵表达式树,然后后续遍历算了,可是建树的过程实在太麻烦了.今天才看到有中缀表达式转换成后缀表达式的算法,可以用栈进行实现 ...
- Oracle的一些命令
sqlldr: 一般用于导入以任何后缀结束的文件,我这次就是因为要导入一张以.20160101为后缀的文件,当初简直束手无策 结合input.ctl使用,可以在DOS下使用,可以对一张表导入数十万,百 ...
- oracle系列--级联删除和级联更新
必须声明:此博客转载于Oracle外键级联删除和级联更新http://www.2cto.com/database/201507/417496.html 鉴于此前收藏的精彩博客无料被删除了,很是痛心,所 ...
- 堡垒机--paramiko模块
做堡垒机之前,来了解一下paramiko模块. 实际上底层封装的SSH. SSHclient(1) import paramiko #实例化一个ssh ssh = paramiko.SSHClient ...
- CNTV视频回看下载地址
这其实不是新方法了,这个方法早在五六年前大家就在用,至今也没失效.但是五六年前那时候这个方法可以下载到过去三个月内CNTV直播过的视频,而现在只能下到一个星期的.之所以要下载回看版本,是因为比栏目版本 ...
- apache 添加 ssl_module
下载httpd2.2.6,以前用http2.2.4会出问题(出现个什么lib的错误) ./configure --prefix=/usr/local/apache --enable-ssl --ena ...