Пробуждение устройства в активности, запущенной 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 (для этого достаточно разбудить процессор).