0

A. Какой изящный способ иметь уведомление android M принести существующую целевую активность из заднего стека вверх (т. Е. Не создать новый экземпляр целевой активности на вершине), при сохранении оставшейся обратно стек нетронутыми, при следующих двух сценариев:Уведомление Android -> предотвратить новую активность, Android M (2017)

  1. Task с целевой активностью находится на переднем плане
  2. Задача с целевой активностью в фоновом режиме

в Если А невозможно, то что s самый изящный способ получить уведомление

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

Это как (за) запуск приложения из его значка на главном экране или в приложении.

C. Если B также невозможно, то какой изящный способ сделать уведомление выполненным B, а затем создать новый экземпляр целевой активности сверху EXCEPT, когда целевая активность уже включена.

Я не думаю, что это уместно, но уведомление задается с переднего плана.

Этот вопрос задан в различных формах раньше и получил много ответов. Однако API-интерфейсы изменились, что больше не срабатывало раньше, большинству ответов много лет, ответы цитируются из документов, которые иногда не следуют практике, терминология, используемая в этих QnA, неправильна и добавляет к общей путанице, и, кроме того, некоторые принятые ответы просто неверны (например, this thread). Кроме того, поведение довольно сложно, учитывая множество различных сценариев, которые могут произойти, и, прочитав почти все QnA по этой теме, я не нашел достаточной технической точности в этих вопросах.

Также It's OK to Ask and Answer Your Own Questions обнадеживает!

Я собираюсь начать документировать свои выводы в качестве ответов на этот вопрос.

Ответы, комментарии, исправления наиболее приветствуются, только если это проверенный механизм для Android M, API 23. Пожалуйста, укажите его для A, B или C. не хотите ли сходить на какие-либо более дикий гусь погонь ;-)

ответ

0

Можно было бы ожидать от documentation что singleTask это именно то, что мне нужно:

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

Но это не работает для удовлетворения A, B или C.Выводы:

  1. Если задача находится на переднем плане & имеет X (целевой экземпляр деятельности) сверху -> нажав на уведомление создает другую X (несколько кликов на уведомления создает несколько экземпляров X накладываются на, каждый из которых имеет вызов в onCreate и может быть уничтожен с помощью обратной связи
  2. Если задача находится на переднем плане & имеет X (целевой объект активности), с Y сверху -> то же поведение, что и в # 1, обратно уничтожает новый экземпляр X, чтобы показать Y, и наконец, экземпляр целевой деятельности X
  3. Если задача выполнена в фоновом режиме -> то же поведение, что и # 1 и # 2

Следующая я тестировал с помощью SingleTop. Он имел то же поведение, что и # 1, когда задача находится на переднем плане или на заднем плане.


Далее я попробовал выбранный ответ here on SO, без каких-либо launchmode флагов.

окончательное уведомление о намеренияхIntent = новое намерение (контекст, YourActivity.class); notificationIntent.setAction (Intent.ACTION_MAIN); notificationIntent.addCategory (Intent.CATEGORY_LAUNCHER); notificationIntent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);

Нет надежды, новые экземпляры создаются сверху, поэтому проблема еще не решена.

0

Next Я попытался выбрать ответ here on SO, который David Wasser опубликовал пару вопросов. Этот механизм довольно изящный. Когда пользователь нажимает на уведомление, создается фиктивная (пустая) активность, и затем можно выбрать запуск целевой активности.

Есть два сценария:

  1. задачи в фоновом режиме: уведомление при нажатии запускает пустую деятельность, которая, в свою очередь запускает целевую активность, так что это вполне нормально
  2. Задачи на переднем плане: это проблема дело. Так как фиктивная активность и по расширению целевая активность создается поверх существующего стека, она побеждает цель. Для того, чтобы решить, что Давид упомянул

В методе OnCreate() из NotificationActivity, проверьте, если ваше приложение работает, и если она не работает startActivity вызова() и запустить приложение.

В том же вопросе, Raginmari предоставил superb solution, чтобы выполнить эту проверку: сделать вызов isTaskRoot() чтобы проверить, если фиктивная деятельностью является корневой активностью задачи. Если фиктивная деятельность является корнем, то ее сценарий 1, иначе его сценарий 2.

Итак, это здорово.На данный момент у меня есть вполне работоспособное решение, удовлетворяющее B в моем вопросе:

B. Если A не представляется возможным, Что самый элегантный способ иметь уведомление

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

  2. Верните фоновое задание на передний план без изменений, не создавая новый экземпляр целевой активности сверху.

0

Далее я попытался выбрать ответ here on SO по CommonsWare, который на самом деле просто. Так просто, что я думал, что это, конечно, не работает :)

Добавить notifyIntent.setFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)

Но работа это сделал, и оказывается, что это было именно решение, которое я искал, так как она удовлетворяет а в моем вопросе:

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

  1. Задача с целевой деятельностью на переднем плане
  2. задач с целевой активностью в фоновом режиме

Выводы:

  1. Если задача находится на переднем плане & имеет X (цель переменного тока tivity instance) сверху -> щелчок на уведомлении показывает тот же X (т. звоните в onResume сделано для X)
  2. Если задача находится на переднем плане & имеет X (экземпляр активности целевой), с Y сверху -> такое же поведение, как и в # 1 (дополнительно позвонить в OnDestroy сделано для Y)
  3. Если задача выполнена в фоновом режиме -> то же поведение, что и # 1 и # 2

Это также имеет смысл с docs.

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

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

и

Если он объявлен режим его запуска, чтобы быть «несколько» (по умолчанию), и вы не установили FLAG_ACTIVITY_SINGLE_TOP в том же намерении, то она будет закончена и воссозданы; для всех других режимов запуска или если установлен FLAG_ACTIVITY_SINGLE_TOP, этот Intent будет доставлен в onNewIntent() текущего экземпляра.

 Смежные вопросы

  • Нет связанных вопросов^_^