Пробуждение экрана Android работает только с full_wake_lock

У меня есть сервис, который прослушивает push-уведомления и создает активность. Все работает хорошо, кроме случаев, когда экран устройства выключен. Желаемое поведение заключается в том, что уведомление будет выводить экран на рабочий стол в заблокированном состоянии и отображать уведомление.

Я могу создать это поведение только с:

mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
                           PowerManager.ACQUIRE_CAUSES_WAKEUP |
                           PowerManager.ON_AFTER_RELEASE,
                           WAKELOCK_KEY);

Тем не менее, я вижу, что Android устарел FULL_WAKE_LOCK в пользу FLAG_KEEP_SCREEN_ON. Однако я попробовал это в действии, которое вызывается из фоновой службы:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
                     WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

И мои журналы показывают, что это действие создается, но на экране все еще не отображается это действие. Если я нажму кнопку питания, на дисплее отобразится действие, сразу подтверждающее, что оно было создано. Вот краткое изложение некоторых вещей, которые я пробовал:

  1. FULL_WAKE_LOCK (работает, но не рекомендуется)
  2. WindowManager - FLAG_TURN_SCREEN_ON, FLAG_KEEP_SCREEN_ON (не работает)
  3. Google WakefulBroadCastReceiver (не работает)

Есть ли альтернативы FULL_WAKE_LOCK?

2 ответа

Пробуждающее (SCREEN_ON) устройство из сервиса работает с

newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | ON_AFTER_RELEASE, "MyTag").

Проверено на Android 4.1, 4.4, 5.0

В моем приложении я просыпаю устройство через AlarmManager и регистрация трансляции событий. Обязательно приобретите Wakelock в WakefulBroadCastReceiver перед запуском сервиса и снятием блокировки не в том же стеке вызовов в сервисе, поскольку при этом устройство будет находиться в SCREEN_OFF.

Вот что делают Android Clock в методе onCreate:

    final Window win = getWindow();
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    // Turn on the screen unless we are being launched from the AlarmAlert
    // subclass as a result of the screen turning off.
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);

Вы используете первый набор флагов?

Изменить: я только что проверил, и это работает.

Другие вопросы по тегам