Открытое Push-сообщение после долгого бездействия - PullRequest
0 голосов
/ 11 июня 2018

У меня есть приложение для Android, которое использует push.Если приложение получает push-сообщение от сервера, оно создает push-уведомление (с заголовком, сообщением, значком) и представляет его пользователю.

обычный случай Щелчок по уведомлению открывает действие (а не средство запуска), и действие открывает фрагмент, который показывает содержимое на основе уведомления.Никакой магии здесь нет, и все работает, как ожидалось.

особый / плохой случай Если устройство неактивно в течение как минимум 2 часов, и вы берете его и нажимаете уведомление, которое было передано ранее, затемон открывает Activity как в обычном случае, но фрагмент не появляется.Вместо этого будет вызываться модуль запуска.

Во время отладки это является дорогостоящим и разочаровывающим временем, я обнаружил следующие вещи.Может быть, у кого-то есть идея:

  • Деятельность обычно начинается с анимации, которую я загружаю из ресурсов.Я загружаю и запускаю его в onCreate ().Если действие вызывается нажатием, анимация загружается, но никогда не запускается.Я обошел это с помощью обработчика, который ждет 2 секунды и проверяет, был ли вызван слушатель анимации.Если нет (плохой случай), то обработчик вызывает код для открытия фрагмента.

  • открытие фрагмента вызвало сбой: IllegalStateException: Невозможно выполнить это после onSaveInstanceState.Подобно тому, как здесь Исключение java.lang.IllegalStateException: не могу выполнить это действие после onSaveInstanceState Поэтому я заменил commitAllowingStateLoss ().Теперь сбоев больше нет, но фрагмент не появляется.Будет вызываться только Fragment.newInstance (), но не onCreate () или какой-либо другой метод жизненного цикла.

Вопрос: Что за сумасшедшее состояние нарушает функции в моем коде после длительного бездействия??

Устройство: в данный момент я тестирую Nexus 5 с Android 6.0.1

1 Ответ

0 голосов
/ 13 июня 2018

Я обнаружил, что если мое устройство находится в этом безумном спящем состоянии, моя активность запускается дважды, если я затем нажимаю на push-уведомление.Сначала нажатие запускает действие с данными в намерении.Затем, после этого, активатор запуска вызывается (с пустым намерением) и запускает главный экран.

Я исправил это как здесь -> Активность открылась дважды

Подводя итог:

1) Я изменил свой код так, чтобы все моиглубокие ссылки, push-уведомления и т. д. будут вызывать активность lauchner.Затем деятельность решает, что делать.Это означает, что у нас есть единственная точка входа в приложение.Это делает все проще и код понятнее.(с этим исправлением одно и то же действие будет вызвано дважды. Нам нужно сделать еще немного, чтобы исправить это)

2) Я пометил действие в манифесте android:launchMode="singleTask".Это означает, что если экземпляр действия уже существует, он будет повторно использован и не будет создан второй раз.

3) Флаг из 2) вызывает метод обратного вызова.Вместо повторного вызова операции система повторно использует уже запущенную операцию и вызывает метод onNewIntent(intent).Это означает, что если действие начато заново, то будет вызван onCreate().Если действие используется повторно (потому что оно было инициировано push-уведомлением, Deeplink и т. Д.), То будет вызван onNewIntent(intent).В обоих случаях, onCreate() и onNewIntent(), я вызываю метод, чтобы решить, какой экран / фрагмент / действие будет следующим, и передаю намерение из getIntent().Готово.

...