Альтернатива PowerManager.FULL_WAKE_LOCK

Рейтинг: 3Ответов: 1Опубликовано: 11.09.2014

По приходу пуша показываю нотификацию, при этом надо включить на пару секунд экран.

Использую в сервисе следующий код:

    PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
    if(!pm.isScreenOn())
    {
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE
                , "MyLock");
        wl.acquire(5000);
    }

Проблема в том, что PowerManager.FULL_WAKE_LOCK помечен как deprecated, и советуют использовать WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON. Вот так:

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

Но как я могу получить доступ к окну из сервиса? Тем более, что девайс спит.
Существует ли альтернатива FULL_WAKE_LOCK?

Ответы

▲ 1

Создайте прозрачное активити и вызывайте его из сервиса с флагом FLAG_ACTIVITY_NEW_TASK:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

В onCreate() активити используйте следующие флаги:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

После разблокировки экрана закройте активити.