Пробуждение экрана 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);
И мои журналы показывают, что это действие создается, но на экране все еще не отображается это действие. Если я нажму кнопку питания, на дисплее отобразится действие, сразу подтверждающее, что оно было создано. Вот краткое изложение некоторых вещей, которые я пробовал:
- FULL_WAKE_LOCK (работает, но не рекомендуется)
- WindowManager - FLAG_TURN_SCREEN_ON, FLAG_KEEP_SCREEN_ON (не работает)
- 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);
Вы используете первый набор флагов?
Изменить: я только что проверил, и это работает.