我正在学习android源代码,并研究过LightsService
框架。
我知道那些编码因设备而异。但是我看到以下代码时会感到困惑。
static int set_light_leds(struct light_state_t const *state, int type)
{
struct an30259a_pr_control led;
memset(&led, 0, sizeof(led));
switch (state->flashMode) {
case LIGHT_FLASH_NONE:
led.state = LED_LIGHT_OFF;
break;
case LIGHT_FLASH_TIMED:
case LIGHT_FLASH_HARDWARE:
led.state = LED_LIGHT_SLOPE;
led.color = state->color & 0x00ffffff;
// tweak to eliminate purplish tint from white color
if (led.color == 0x00ffffff)
led.color = 0x80ff80;
// scale slope times based on flashOnMS
led.time_slope_up_1 = (SLOPE_UP_1 * state->flashOnMS) / 1000;
led.time_slope_up_2 = (SLOPE_UP_2 * state->flashOnMS) / 1000;
led.time_slope_down_1 = (SLOPE_DOWN_1 * state->flashOnMS) / 1000;
led.time_slope_down_2 = (SLOPE_DOWN_2 * state->flashOnMS) / 1000;
led.mid_brightness = MID_BRIGHTNESS;
led.time_off = state->flashOffMS;
break;
default:
return -EINVAL;
}
return write_leds(&led);
}
static int set_light_leds_notifications(struct light_device_t *dev,
struct light_state_t const *state)
{
return set_light_leds(state, 0);
}
static int set_light_leds_attention(struct light_device_t *dev,
struct light_state_t const *state)
{
return set_light_leds(state, 1);
}
我的第一个问题是:
set_light_leds_notifications()
和set_light_leds_attention()
使用不同的第二个参数,同时调用set_light_leds()
函数。
但是set_light_leds()函数在其定义中根本没有使用int类型。
然后,
他们之间有什么区别?
分别打电话给他们的目的是什么?
我的第二个问题是:
我知道两者都用于通知用户有关信息。但我想了解有关这些差异的更多细节,特别是在哪种情况下注意力比通知更重要。
答案 0 :(得分:1)
在Lights.h中:
#define LIGHT_ID_BACKLIGHT "backlight"
#define LIGHT_ID_KEYBOARD "keyboard"
#define LIGHT_ID_BUTTONS "buttons"
#define LIGHT_ID_BATTERY "battery"
#define LIGHT_ID_NOTIFICATIONS "notifications"
#define LIGHT_ID_ATTENTION "attention"
评论说
这些灯光ID对应逻辑灯光,而非物理灯光。因此对于 例如,如果您的指示灯与您的按钮一致,则为 也可能有意义地将指示灯照亮到合理的位置 按钮点亮时的颜色。
和
#define LIGHT_ID_BLUETOOTH "bluetooth"
#define LIGHT_ID_WIFI "wifi"
所以可能会有一些真正的亮点,例如,一些Android平板电脑有wifi灯,蓝牙灯。并且还有一些逻辑灯,Android设计师设计这些逻辑灯使得不同的事件可以产生不同的灯光效果。
在您的代码中,set_light_leds_notifications
和set_light_leds_attention
实际上是相同的,因为set_light_leds
无法区分它们。它表示设备当前不希望在通知和注意之间显示不同的灯光。但可能还有一些其他设备在乎。
Android中的灯光服务将在不同设备中实现不同的实现。
devices->lights[LIGHT_INDEX_BACKLIGHT]
= get_device(module, LIGHT_ID_BACKLIGHT);
devices->lights[LIGHT_INDEX_KEYBOARD]
= get_device(module, LIGHT_ID_KEYBOARD);
devices->lights[LIGHT_INDEX_BUTTONS]
= get_device(module, LIGHT_ID_BUTTONS);
devices->lights[LIGHT_INDEX_BATTERY]
= get_device(module, LIGHT_ID_BATTERY);
devices->lights[LIGHT_INDEX_NOTIFICATIONS]
= get_device(module, LIGHT_ID_NOTIFICATIONS);
devices->lights[LIGHT_INDEX_ATTENTION]
= get_device(module, LIGHT_ID_ATTENTION);
devices->lights[LIGHT_INDEX_BLUETOOTH]
= get_device(module, LIGHT_ID_BLUETOOTH);
devices->lights[LIGHT_INDEX_WIFI]
= get_device(module, LIGHT_ID_WIFI);
我认为我不需要进一步解释这一点,因为你“知道那些编码因设备而异。”
对于你的第二个问题:Android应用程序中的通知和注意力之间有什么不同?
没有太大的区别。我不认为在NotificationManager中有一个名为注意的实体。检查源后,我发现当通知中设置了FLAG_SHOW_LIGHTS标志时,将启用注意灯。
if ((n.notification.flags & Notification.FLAG_SHOW_LIGHTS) != 0) {
mAttentionLight.pulse();
}
所以我认为你可以使用Notification中的flags变量来区分注意力和通知。在某些设备中,可能没有通知指示灯,因此当存在非紧急通知时,不会有任何指示灯闪烁。但是可能存在注意灯,因此如果您的应用程序有重要通知来通知用户,请设置FLAG_SHOW_LIGHTS,并且将关闭注意灯。