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的使用方式:

  1. 获取特定的Light:

mBatteryLight = lights.getLight(LightService.LIGHT_ID_BATTERY);

  1. 根据需求,在不同的状态下,调用相关函数完成指示灯的功能:

mBatteryLight.setColor();

mBatteryLight.setFlashing();

Android Lights的更多相关文章

  1. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  2. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  3. Xamarin.Android通知详解

    一.发送通知的机制 在日常的app应用中经常需要使用通知,因为服务.广播后台活动如果有事件需要通知用户,则需要通过通知栏显示,而在Xamarin.Android下的通知需要获取Notification ...

  4. Android Weekly Notes Issue #219

    Android Weekly Issue #219 August 21st, 2016 Android Weekly Issue #219 ARTICLES & TUTORIALS Andro ...

  5. android HAL 教程(含实例)

    http://www.cnblogs.com/armlinux/archive/2012/01/14/2396768.html Android Hal 分析                       ...

  6. [Android]Android系统启动流程源码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5013863.html Android系统启动流程源码分析 首先 ...

  7. repo: 创建local manifest以及如何添加app到CM/Android build系统中

    The local manifest Creating a local manifest allows you to customize the list of repositories on you ...

  8. Xamarin.Android开发实践(六)

    Xamarin.Android通知详解 一.发送通知的机制 在日常的app应用中经常需要使用通知,因为服务.广播后台活动如果有事件需要通知用户,则需要通过通知栏显示,而在Xamarin.Android ...

  9. android backlight

    背光设置是在:设置->声音和显示->亮度,通过进度条来设置的. 文件:packages/apps/Settings/src/com/android/settings/BrightnessP ...

随机推荐

  1. zabbix 布署实践【4 服务器自动探索发现,并且自动关联模版】

    使用管理员登录zabbix后,在配置---自动发现--创建发现规则 如下:我们的需求是监听办公网内openstack的所有虚拟机,在其VM创建后,自动加到zabbix监控中来,并自动关联监控模版 可以 ...

  2. 敏捷开发(七)- SCRUM评估会议

    本文主要是为了检测你对SCRUM 评估会议的了解和使用程度, 通过本文你可以检测一下     1.你们的SCRUM 评估会议的过程和步骤    2.SCRUM 评估的输出结果一.会议目的      1 ...

  3. openstack私有云布署实践【10.2 计算nova - controller节点配置(办公网环境)】

    一.首先登录controller1创建nova数据库,并赋于远程和本地访问的权限.     mysql -u root -p   CREATE DATABASE nova; GRANT ALL PRI ...

  4. Python学习笔记——基础篇【第六周】——json & pickle & shelve & xml处理模块

    json & pickle 模块(序列化) json和pickle都是序列化内存数据到文件 json和pickle的区别是: json是所有语言通用的,但是只能序列化最基本的数据类型(字符串. ...

  5. python下载时报错 Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time

    def downloadXml(isExists,filedir,filename): if not isExists: os.mkdir(filedir) local = os.path.join( ...

  6. TheSixthWeekJavaText

    加密文档 实验要求编写一个算法加密一串英文字串. 设计思想:对于一个字符串,我们可以用String.charAt()方法依次取出其中的字符元素,组成一个字符数组.由于字符可以转化为short类型变量进 ...

  7. FlatBuffers入门

    1.下载flatbuffers 从https://github.com/google/flatbuffers地址下载flatbuffers-master.zip文件. 2.编译flatbuffers ...

  8. ES6 之 Set数据结构和Map数据结构 Iterator和for...of循环

    ECMAScript 6 入门 Set数据结构 基本用法 ES6提供了新的数据结构Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set本身是一个构造函数,用来生成Set数据结构. va ...

  9. MVC学习笔记--IEnumerable的用法

    IEnumerable的用法 IEnumerable和IEnumerable<T>接口在.NET中是非常重要的接口,它允许开发人员定义foreach语句功能的实现 并支持非泛型方法的简单的 ...

  10. Java中ArrayList和LinkedList性能的比较(结果总是怪怪的,如果有不当还请指出)。

    不说废话,直接看代码: /** * @author HuYang * @date 2016年8月15日 下午3:26:43 */ public class TestJiHe { private sta ...