lightservice 主要用于指示灯的闪烁等操作,具体源码
/frameworks/base/services/core/java/com/android/server/lights/LightsService.java
122 public LightsService(Context context) {
123 super(context);
124
125 mNativePointer = init_native();
126
127 for (int i = 0; i < LightsManager.LIGHT_ID_COUNT; i++) {
128 mLights[i] = new LightImpl(i);
129 }
130 }
init_native 如下,可以看到只要是open hal层最多可以支持8个灯的控制.
/frameworks/base/services/core/jni/com_android_server_lights_LightsService.cpp
static jlong init_native(JNIEnv* /* env */, jobject /* clazz */)
64{
65 int err;
66 hw_module_t* module;
67 Devices* devices;
68
69 devices = (Devices*)malloc(sizeof(Devices));
70
71 err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
72 if (err == 0) {
73 devices->lights[LIGHT_INDEX_BACKLIGHT]
74 = get_device(module, LIGHT_ID_BACKLIGHT);
75 devices->lights[LIGHT_INDEX_KEYBOARD]
76 = get_device(module, LIGHT_ID_KEYBOARD);
77 devices->lights[LIGHT_INDEX_BUTTONS]
78 = get_device(module, LIGHT_ID_BUTTONS);
79 devices->lights[LIGHT_INDEX_BATTERY]
80 = get_device(module, LIGHT_ID_BATTERY);
81 devices->lights[LIGHT_INDEX_NOTIFICATIONS]
82 = get_device(module, LIGHT_ID_NOTIFICATIONS);
83 devices->lights[LIGHT_INDEX_ATTENTION]
84 = get_device(module, LIGHT_ID_ATTENTION);
85 devices->lights[LIGHT_INDEX_BLUETOOTH]
86 = get_device(module, LIGHT_ID_BLUETOOTH);
87 devices->lights[LIGHT_INDEX_WIFI]
88 = get_device(module, LIGHT_ID_WIFI);
89 } else {
90 memset(devices, 0, sizeof(Devices));
91 }
92
93 return (jlong)devices;
94}
LightImpl也是定义在/frameworks/base/services/core/java/com/android/server/lights/LightsService.java 中是lightService的具体实现.其所有函数:
如setBrightness 最终都是调用setLight_native 来实现的
106static void setLight_native(JNIEnv* /* env */, jobject /* clazz */, jlong ptr,
107 jint light, jint colorARGB, jint flashMode, jint onMS, jint offMS, jint brightnessMode)
108{
109 Devices* devices = (Devices*)ptr;
110 light_state_t state;
111
112 if (light < 0 || light >= LIGHT_COUNT || devices->lights[light] == NULL) {
113 return ;
114 }
115
116 memset(&state, 0, sizeof(light_state_t));
117 state.color = colorARGB;
118 state.flashMode = flashMode;
119 state.flashOnMS = onMS;
120 state.flashOffMS = offMS;
121 state.brightnessMode = brightnessMode;
122
123 {
124 ALOGD_IF_SLOW(50, "Excessive delay setting light");
125 devices->lights[light]->set_light(devices->lights[light], &state);
126 }
可见都是调用hal层的函数来实现的。
132 @Override
133 public void onStart() {
134 publishLocalService(LightsManager.class, mService);
135 }
发布一个service
137 private final LightsManager mService = new LightsManager() {
138 @Override
139 public Light getLight(int id) {
140 if (id < LIGHT_ID_COUNT) {
141 return mLights[id];
142 } else {
143 return null;
144 }
145 }
146 };
如果要实现闪灯操作的话,一般通过mService,得到lightsManager如下所示:
171 LightsManager lights = LocalServices.getService(LightsManager.class);
172 mBacklight = lights.getLight(LightsManager.LIGHT_ID_BACKLIGHT);
使用的话可以直接调用lightsManager的成员函数,如setBrightness 来执行.
mBacklight.setBrightness(brightness);
/frameworks/base/services/core/java/com/android/server/lights/LightsService.java
122 public LightsService(Context context) {
123 super(context);
124
125 mNativePointer = init_native();
126
127 for (int i = 0; i < LightsManager.LIGHT_ID_COUNT; i++) {
128 mLights[i] = new LightImpl(i);
129 }
130 }
init_native 如下,可以看到只要是open hal层最多可以支持8个灯的控制.
/frameworks/base/services/core/jni/com_android_server_lights_LightsService.cpp
static jlong init_native(JNIEnv* /* env */, jobject /* clazz */)
64{
65 int err;
66 hw_module_t* module;
67 Devices* devices;
68
69 devices = (Devices*)malloc(sizeof(Devices));
70
71 err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
72 if (err == 0) {
73 devices->lights[LIGHT_INDEX_BACKLIGHT]
74 = get_device(module, LIGHT_ID_BACKLIGHT);
75 devices->lights[LIGHT_INDEX_KEYBOARD]
76 = get_device(module, LIGHT_ID_KEYBOARD);
77 devices->lights[LIGHT_INDEX_BUTTONS]
78 = get_device(module, LIGHT_ID_BUTTONS);
79 devices->lights[LIGHT_INDEX_BATTERY]
80 = get_device(module, LIGHT_ID_BATTERY);
81 devices->lights[LIGHT_INDEX_NOTIFICATIONS]
82 = get_device(module, LIGHT_ID_NOTIFICATIONS);
83 devices->lights[LIGHT_INDEX_ATTENTION]
84 = get_device(module, LIGHT_ID_ATTENTION);
85 devices->lights[LIGHT_INDEX_BLUETOOTH]
86 = get_device(module, LIGHT_ID_BLUETOOTH);
87 devices->lights[LIGHT_INDEX_WIFI]
88 = get_device(module, LIGHT_ID_WIFI);
89 } else {
90 memset(devices, 0, sizeof(Devices));
91 }
92
93 return (jlong)devices;
94}
LightImpl也是定义在/frameworks/base/services/core/java/com/android/server/lights/LightsService.java 中是lightService的具体实现.其所有函数:
如setBrightness 最终都是调用setLight_native 来实现的
106static void setLight_native(JNIEnv* /* env */, jobject /* clazz */, jlong ptr,
107 jint light, jint colorARGB, jint flashMode, jint onMS, jint offMS, jint brightnessMode)
108{
109 Devices* devices = (Devices*)ptr;
110 light_state_t state;
111
112 if (light < 0 || light >= LIGHT_COUNT || devices->lights[light] == NULL) {
113 return ;
114 }
115
116 memset(&state, 0, sizeof(light_state_t));
117 state.color = colorARGB;
118 state.flashMode = flashMode;
119 state.flashOnMS = onMS;
120 state.flashOffMS = offMS;
121 state.brightnessMode = brightnessMode;
122
123 {
124 ALOGD_IF_SLOW(50, "Excessive delay setting light");
125 devices->lights[light]->set_light(devices->lights[light], &state);
126 }
可见都是调用hal层的函数来实现的。
132 @Override
133 public void onStart() {
134 publishLocalService(LightsManager.class, mService);
135 }
发布一个service
137 private final LightsManager mService = new LightsManager() {
138 @Override
139 public Light getLight(int id) {
140 if (id < LIGHT_ID_COUNT) {
141 return mLights[id];
142 } else {
143 return null;
144 }
145 }
146 };
如果要实现闪灯操作的话,一般通过mService,得到lightsManager如下所示:
171 LightsManager lights = LocalServices.getService(LightsManager.class);
172 mBacklight = lights.getLight(LightsManager.LIGHT_ID_BACKLIGHT);
使用的话可以直接调用lightsManager的成员函数,如setBrightness 来执行.
mBacklight.setBrightness(brightness);