ОбработкаNewIntent для FLAG_ACTIVITY_NEW_TASK - PullRequest
5 голосов
/ 22 марта 2012

У меня есть Activity, работающая в однопользовательском режиме и C2DM-приемник.В некоторых уведомлениях мне нужно выполнить это действие, и я делаю это следующим образом:

Intent activity = new Intent(context, klass);
activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(activity);

Когда выполняется задний фон (например, кнопка «Домой», нажатая ранее), все работает нормально.Но когда я просто нажал кнопку питания, чтобы выключить экран, текущая активность не может быть уведомлена о некоторых изменениях (onNewIntent никогда не вызывается).

Как я могу уведомить текущую активность об уведомлении?

Ответы [ 2 ]

4 голосов
/ 28 марта 2012

Скайред, я думаю, у меня была точно такая же ситуация.Однако я заметил, что когда телефон спал и на занятие было отправлено новое намерение, оно не запустит занятие, пока не включится экран (для своих целей я хотел, чтобы экран был включен).

Мое решение состояло в том, чтобы приобрести пробуждение в моем приемнике C2DM.

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP,     TAG);
mWakeLock.acquire();

Конечно, обязательно снимите блокировку с помощью mWakeLock.release () в своей активности.

Это странное поведение, которое, похоже, не согласуется с другим поведением активности Android,В моем случае я использую однозадачное действие (я не уверен, какой вид деятельности вы используете, вы не указали).Если в верхней части стека нет экземпляра действия, и телефон спит, мое действие запустится, и я могу использовать в onCreate () следующее:

getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);

Однако, если действиенаходится на вершине стека, и телефон спит, активность не начинается, пока я не включу экран.Надеюсь, это работает для вас.Если вам не нужен экран, я бы попробовал поиграть с другими флагами для wakelock.

1 голос
/ 22 марта 2012

Согласно вашей конфигурации, это должно работать:

  • создайте класс приложения как одиночный, позже вы сможете легко получить к нему доступ
  • предоставьте ему элемент данных, который является моделью данных, он будет доступен как из получателя уведомлений C2DM, так и из всех действий
  • построить модель данных в соответствии с шаблоном проектирования Observable-Observer
  • уведомление C2DM изменит модель
  • активности, в onCreate будет подключен прослушиватель событий, отключите во время onDestroy
  • при изменении модели запускается событие для всех слушателей, а действия, когда они получают событие, обновляют свой пользовательский интерфейс

Это также хорошая возможность улучшить дизайн вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...