Android Уведомление: нажмите «Сохранить стек» и при необходимости выведите приложение на передний план. Передача данных, если указано c активность находится наверху - PullRequest
2 голосов
/ 19 июня 2020

Как я могу щелкнуть уведомление, вывести мое приложение на передний план, если необходимо, и сохранить стек таким, каким он был (даже когда приложение перешло в фоновый режим)?

У меня есть NotificationClickActivity, запускается, когда пользователь нажимает на уведомление.

При нажатии на уведомление у меня есть два возможных сценария ios:

  1. Пользователь вышел из приложения
  2. Пользователь вошел в систему.

В первом сценарии NotificationClickActivity запускает процесс входа в систему и получает результат. Если все в порядке, запускаю MainActivity. Задача очищена, поэтому MainActivity - единственное действие, которое у меня есть в задаче. В этом сценарии у меня нет проблем.

Во втором сценарии NotificationClickActivity делает следующее:

finish()  
startActivity(MainActivity.createIntent(this).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP).putExtra("notification", notification))

С приведенным выше кодом, если приложение уже запущено (MainActivity - это root и максимальная активность) и если на заднем или на переднем плане, у меня нет проблем. Вызывается MainActivity onNewIntent, и я могу делать что угодно с уведомлением. В этом случае я отправляю уведомление в репозиторий.

Проблема, с которой я сталкиваюсь, это когда у меня есть действия поверх MainActivity. Представьте себе следующий стек:

MainActivity -> ActivityOne -> ActivityTwo -> ActivityN

С кодом, который у меня сейчас есть, если я нажму на уведомление, стек станет:

MainActivity -> ActivityOne -> ActivityTwo -> ActivityN -> MainActivity

Я хочу, чтобы стек оставался MainActivity -> ActivityOne -> ActivityTwo -> ActivityN, но все же передать уведомление на MainActivity, чтобы его можно было отправить в репозиторий.

Есть идеи, как я могу этого добиться?

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

1 Ответ

0 голосов
/ 20 июня 2020

Думаю, вы ищете FLAG_ACTIVITY_REORDER_TO_FRONT

.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP || FLAG_ACTIVITY_REORDER_TO_FRONT)

Это приведет к тому, что действие окажется на вершине стека, если оно уже выполняется.

рассмотрим задачу, состоящую из четырех действий: A, B, C, D. Если D вызывает startActivity () с намерением, которое разрешается в компоненте действия B, то B будет переведен в перед стеком истории, с таким результирующим порядком: A, C, D, B.

В приведенном выше примере, если вы хотите go из A, B, C, D на A, B, C, D, B, тогда вам необходимо убедиться, что ваша активность поддерживает несколько экземпляров.

Предложите FLAG_ACTIVITY_SINGLE_TOP указать в android манифесте для действия вместо. Затем в вашем onNewIntent вы должны проверить, вошел ли пользователь в систему. Если пользователь не вошел в систему, вы должны запустить процесс входа с помощью startActivityForResult и обработать результат входа с помощью onActivityResult.

Это предполагает ваш вход в систему может быть инициирован с намерением, которое вызывает setResult с достаточной информацией для вызывающего абонента, чтобы определить, был ли вход в систему успешным.

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

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