2

我正在学习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 类型。

然后,

  • 它们之间有什么区别?

  • 分别调用它们的目的是什么?

我的第二个问题是:

  • android应用程序中的通知和注意之间有什么一般区别?

我知道两者都用于通知用户有关信息。但我想了解更多关于这些差异的细节,特别是在哪些情况下,注意力比通知更重要。

4

1 回答 1

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 对应于逻辑灯,而不是物理灯。例如,如果您的 INDICATOR 灯与您的 BUTTONS 一致,则在 BUTTONS 点亮时将 INDICATOR 灯也点亮为合理的颜色可能是有意义的。

#define LIGHT_ID_BLUETOOTH          "bluetooth"
#define LIGHT_ID_WIFI               "wifi"

所以可能会有一些真光,比如一些安卓pad有wifi灯,蓝牙灯。还有一些逻辑灯,Android设计师设计这些逻辑灯,让不同的事件可以产生不同的灯光效果。

在您的代码中, theset_light_leds_notifications和 theset_light_leds_attention实际上是相同的,因为 theset_light_leds不能区分它们。它表明设备当前不想在通知和注意之间显示不同的灯光。但可能还有其他一些关心的设备。

Android中的lights服务会在不同的设备上得到不同的实现。

    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 应用程序中的通知和注意之间的一般区别是什么?

没有大的区别。我不认为 N​​otificationManager 中有一个名为 attention 的实体。查了源码后发现,在通知中设置了 FLAG_SHOW_LIGHTS 标志时,会启用注意灯。

if ((n.notification.flags & Notification.FLAG_SHOW_LIGHTS) != 0) {
    mAttentionLight.pulse();
}

所以我认为你可以在 Notification 中使用 flags 变量来区分注意力和通知。在某些设备中,可能没有通知灯,因此在有非紧急通知时不会有任何灯闪烁。但是可能会有注意灯,所以如果你的应用有重要的通知要通知用户,设置FLAG_SHOW_LIGHTS on,注意灯就会打开。

于 2013-04-02T06:09:47.327 回答