Каков правильный, не устаревший способ пробудить устройство?
Мое требование: после получения сообщения GCM устройство должно проснуться, чтобы отобразить высокоприоритетное уведомление. Устройство должно включить экран.
В настоящее время я использую WakeLock для достижения этой цели. Метод newWakeLock()
ожидает уровень блокировки И флаг должен быть передан (как 1-й параметр, побитовое или -d).
Я использую флаг PowerManager.ACQUIRE_CAUSES_WAKEUP
, поскольку он делает именно то, что мне нужно. Тем не менее, я немного разочарован уровнем блокировки. Итак, согласно docs, я получил следующие варианты:
-
PARTIAL_WAKE_LOCK
- не совместим с ACQUIRE_CAUSES_WAKEUP
/не включает экран
-
SCREEN_DIM_WAKE_LOCK
- устаревший
-
SCREEN_BRIGHT_WAKE_LOCK
- устаревший
-
FULL_WAKE_LOCK
- устаревший
Предлагаемый FLAG_KEEP_SCREEN_ON
полностью бесполезен в этом сценарии. Я закончил тем, что просто подавил предупреждение об отказе:
@SuppressWarnings("deprecation")
PowerManager.WakeLock screenOn = ((PowerManager) c.getSystemService(Context.POWER_SERVICE)).newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
screenOn.acquire();
mNotifyMgr.notify(mNotificationId, mBuilder.build());
screenOn.release();
Вопрос: существует ли непринужденный надежный способ пробуждения устройства в описанном случае?
EDIT Я не прошу об обходах, чтобы разбудить устройство. Мой вопрос заключается в том, можно ли пробудить устройство из фона (без запуска Activity
) без использования устаревших API
Ответы
Ответ 1
Используйте код, который я получил от моего вопроса, а затем просто закончить действие, должен оставить экран включенным для обычного времени пользователя. Поверьте мне, это единственный способ, проведя хорошую неделю по этой проблеме. Вы всегда можете настроить прозрачность с помощью notitlebar, пользователь никогда не узнает.
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
finish();
}