Android Lights
Android Lights
很多Android手机上都配有LED灯,手机在充电、新来短信等时候都会有相应的指示灯提示。
Android系统之中,一共定义了8个逻辑灯,包含:背光,键盘灯,按键灯,充电指示灯,通知提示等。

图表 A Android中的提示灯
其中,定义了系统中所有可能用到的Light。
Jni与Native:
与Lights相关的JNI代码在目录:frameworks/base/services/jni下,
So库的加载:
编译:Frameworks/base/services/jni/Android.mk中:

图表 B lights相关库文件的编译
生成动态库:libandroid_servers.so。
Java中加载so库时,系统调用方法:
Extern “C” jint JNI_OnLoad(JavaVM* vm, void* reserved) {
……
Register_android_server_LightsService(env);
……
}
来完成jni中相关函数的注册过程。

图表 C JNI中相关函数的注册
至此,已经通过jni建立了java与native函数的映射关系。在java代码中,可以通过调用相关函数来完成相应的功能了。
三个函数:
Jni中,通过JNI方式提供给java层调用的函数有三个:
Static JNINativeMethod mothod_table[] = {
{ “init_native”, “()I”, (void*)init_native, },
{ “finalize_native”, “(I)V”, (void*)finalize_native, },
{ “setLight_native”, “(IIIIIII)V”, (void*)setLight_native, },
};
- Static jint init_native(JNIEnv *env, jobject clazz)
{
//通过hw_get_module方法查到到注册为LIGHTS_HARDWARE_MODULE_ID,即:”lights”的module模块。
err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
if (err == 0)
{
Devices->lights[LIGHT_INDEX_BACKLIGHT] = get_device(module, LIGHT_ID_BACKLIGHT);
Devices->lights[LIGHT_INDEX_KEYBOARD] = get_device(module, LIGHT_INDEX_KEYBOARD);
……
}
}
- Static void finalize_native(JNIEnv *env, jobject clazz, int ptr)
{
If (devices == NULL)
{
Return;
}
Free(devices);
}
- Static void setLight_native(JNIEnv *env, jobject clazz, int ptr, int light, int colorARGB, int flashMode, int onMS, int offMS, int brightnessMode)
{
Memset(&state, 0, sizeof(light_state_t));
State.color = colorARGB;
State.flashMode = flashMode;
State.flashOnMS = onMS;
State.flashOffMS = offMS;
State.brightnessMode = brightnessMode;
……
Devices->lights[light]->setlight(devices->lights[light], &state);
}
Java Framework:
关于Light的系统服务:
services/java/com/android/server/LightsService.java

图表 D Frameworks中的LightsService
其中,有个很重要的内部类 Light,表示某种具体类型的指示灯,类图如下:

图表 E Frameworks中的Light类图
类中,最重要的一个方法:
Private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode)
{
mColor = color;
mMode = mode;
mOnMS = onMS;
mOffMS = offMS;
// 最后,通过调用native方法来完成函数功能
setLight_native(mNativePointer, mId, color, mode, onMS, offMS, brightnessMode);
}
二、 如何应用:
对于控制lights的服务——LightsService.java,android框架层没有提供直接的调用该类中相关功能函数的接口,所以应用程序无法通过直接调用API来控制指示灯的显示。
这里可以参考BatteryService类中对3-Color Light的使用方式:



- 获取特定的Light:
mBatteryLight = lights.getLight(LightService.LIGHT_ID_BATTERY);
- 根据需求,在不同的状态下,调用相关函数完成指示灯的功能:
mBatteryLight.setColor();
mBatteryLight.setFlashing();
Android Lights的更多相关文章
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Xamarin.Android通知详解
一.发送通知的机制 在日常的app应用中经常需要使用通知,因为服务.广播后台活动如果有事件需要通知用户,则需要通过通知栏显示,而在Xamarin.Android下的通知需要获取Notification ...
- Android Weekly Notes Issue #219
Android Weekly Issue #219 August 21st, 2016 Android Weekly Issue #219 ARTICLES & TUTORIALS Andro ...
- android HAL 教程(含实例)
http://www.cnblogs.com/armlinux/archive/2012/01/14/2396768.html Android Hal 分析 ...
- [Android]Android系统启动流程源码分析
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5013863.html Android系统启动流程源码分析 首先 ...
- repo: 创建local manifest以及如何添加app到CM/Android build系统中
The local manifest Creating a local manifest allows you to customize the list of repositories on you ...
- Xamarin.Android开发实践(六)
Xamarin.Android通知详解 一.发送通知的机制 在日常的app应用中经常需要使用通知,因为服务.广播后台活动如果有事件需要通知用户,则需要通过通知栏显示,而在Xamarin.Android ...
- android backlight
背光设置是在:设置->声音和显示->亮度,通过进度条来设置的. 文件:packages/apps/Settings/src/com/android/settings/BrightnessP ...
随机推荐
- 为什么Intent传递对象的时候必须要将对象序列化呢?
Intent可以算是四大组件之间的胶水,比如在Activity1与Activity2之间传递对象的时候,必须要将对象序列化, 可是为什么要将对象序列化呢? Intent在启动其他组件时,会离开当前应用 ...
- Dojo的UI框架bootstrap for dojo和Dojo-Bootstrap简介
最近在学习Dojo,但样式问题真是头疼呀,虽然清新的淡蓝色很是减缓眼睛的疲劳,但这个扁平化简约风盛行的年代,光是清新的拟物已经满足不了群众的需求了,所以就在这样的需求下,我知道了bootstrap f ...
- 页面导入样式时,使用link和@import有什么区别?
1 link属于XHTML标签,而@import是CSS提供的: 2 页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载: 3 import只有在IE5以上才能 ...
- Mac终端命令收集
一.利用命令行执行文件 cd到要执行文件的文件夹 输入python xx.py 命令即可(xx表示要执行的文件名称)
- UEFI主板GPT方式安装CentOS6.4
1. 设置BIOS:禁用CSM,禁用安全启动: 或不用禁用CSM,但以EFI方式安装系统: 2. 使用Diskgen或类似工具把硬盘格式为GPT格式(可以建立多于4个的主分区了): 3. 官 ...
- 内存溢出System.OutOfMemoryException
.Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结 在什么情况下会出现OutOfMemonryException呢? 在我们试图新建一个对象时,而垃圾 ...
- Linux之top
简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按 ...
- log4j.properties 的使用详解
一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失IN ...
- webStorm(一)
1.打开webStorm选择activation code输入注册码 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIj ...
- KVM设置DHCP、DNS、Gateway
添加网卡 sudo vi /etc/network/interfaces #添加下面的配置 >>>>>>>> auto tap0 iface tap0 ...