Пробуждение устройства в активности, запущенной AlarmManager

У меня есть приложение, которое запускает полноэкранный режим в определенный момент времени (в зависимости от настроек пользователя). Мне нужно разбудить устройство, когда это произойдет, чтобы пользователь мог видеть активность. Я использую AlarmManager для планирования этих событий, и, кажется, он работает нормально (я не заметил пропущенного события тревоги), однако на некоторых устройствах бывает, что экран не включается. В этом случае, если я вручную просыпаю устройство, я вижу, что моя активность есть, и она работает, просто не включается экран. Я не могу воспроизвести это каждый раз, иногда это работает, иногда нет. Есть некоторые устройства, которые работают нормально все время. Я вижу эту проблему на разных версиях ОС, так что она не специфична для SDK.

Пример того, как я устанавливаю AlarmManager:

Intent myIntent = new Intent(context, AlarmActivity.class);
myIntent.putExtras(extras);
PendingIntent pIntent = PendingIntent.getActivity(context, ID, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager)
context.getSystemService(Context.ALARM_SERVICE); 
alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInMillis, pIntent);

Вот что я использую в onCreate AlarmActivity:

PowerManager pm;
WakeLock wakeLock;
WakeLock cpuWake;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    pm = (PowerManager) getSystemService(POWER_SERVICE);
    cpuWake = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
    cpuWake.acquire();
    wakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP
            | PowerManager.FULL_WAKE_LOCK, TAG);
    if (!wakeLock.isHeld()) {
        wakeLock.acquire();
    } 

    final Window win = getWindow();
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
            | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.layout);
//rest of the code

Примечание: я пробовал без PARTIAL_WAKE_LOCK, результат был таким же.

Есть идеи, что я делаю не так?

Буду признателен за любые комментарии, так как эта проблема вызывает у меня головную боль сейчас.

Спасибо.

1 ответ

Ну, чтобы ускорить процесс отладки, я решил использовать одно из моих тестовых устройств, которое я смог использовать для воспроизведения этой проблемы. После многих попыток я понял, что даже стандартные часы ведут себя одинаково, поэтому практически все мои попытки сводятся на нет. В любом случае мне удалось воспроизвести его на другом устройстве (менее вероятно).

То, что я в конечном итоге использовал (основываясь на других ответах SO), это BroadcastReciever для моих сигналов тревоги и статический способ использования wakelock (получение при получении широковещательной передачи и отпускание в момент прекращения действия). Пока что похоже на работу.

У меня была другая проблема с wakelock в сервисе, для этого я использовал wakefulbroadcastreceiver и startwakefulservice (для этого достаточно разбудить процессор).

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