Когда я вывожу свое приложение на передний план, последнее действие не загружается

Я получаю неожиданное поведение:

  • Действие A = действие запуска
  • Действие B = оно запущено из уведомления

Когда я закрываю приложение и открываю его из уведомления, запускается действие B.

Итак, когда я нажимаю кнопку HOME, приложение переходит к действию A. Затем я нажимаю кнопку НАЗАД, и приложение переходит в фоновый режим, и я получаю главный экран Android.

Это нормально, но если я открою меню последних приложений и снова выберу свое приложение, оно загрузит действие B вместо действия A, как я и ожидал. Я действительно не знаю, что происходит.

Намерение, установленное в построителе уведомлений:

Intent intent = new Intent(this, ActivityB.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

В действии B у меня есть:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (id == android.R.id.home) {
        Intent intent = new Intent(ActivityB.this, ActivityA.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
    }

Любая идея или предложение?


person alvaro torrico    schedule 19.01.2017    source источник
comment
это происходит каждый раз или только после того, как вы нажмете кнопку и загрузите приложение? \   -  person Charuක    schedule 19.01.2017
comment
Только когда я запускаю Activity B из push-уведомления.   -  person alvaro torrico    schedule 19.01.2017
comment
используйте .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); и скажите мне, работает ли это!   -  person Charuක    schedule 19.01.2017
comment
Я пробовал, но, к сожалению, не работает   -  person alvaro torrico    schedule 19.01.2017


Ответы (3)


Это происходит потому, что задача, которая находится в списке последних задач, была запущена из Notification с ActivityB в качестве корня Activity. Если вы выберете эту задачу из списка недавних задач, Android выведет существующую задачу на передний план. Однако, если в задаче нет активных действий (все действия завершены), Android снова запускает корневой Activity из этой задачи.

Вам необходимо предотвратить добавление приложения в список последних задач, если оно запущено из Notification. Вы можете сделать это, добавив:

android:excludeFromRecents="true"

к записи манифеста для ActivityB.

person David Wasser    schedule 19.01.2017
comment
То, что вы говорите, имеет смысл. Как я могу исключить из rencents это действие только тогда, когда оно запускается из уведомления? - person alvaro torrico; 19.01.2017
comment
Делая то, что я сказал. Поскольку ваша обычная программа запуска Activity — это ActivityA, приложение будет отображаться в списке недавних, когда оно запущено с помощью ActivityA, но не будет отображаться при запуске с помощью ActivityB. - person David Wasser; 19.01.2017
comment
О, ты прав. Ваше решение работает. Но было бы здорово, если бы вместо этого я мог получить основную активность от rencents. - person alvaro torrico; 19.01.2017
comment
Единственный способ сделать это — заставить ваш Notification запустить основной Activity и передать ему несколько дополнительных, чтобы он знал, что нужно немедленно запустить ActivityB (передавая дополнительные функции ActivityB. В этом случае ваша задача всегда будет начинаться с ActivityA, поэтому вы можете оставить его в списке недавних.Однако, насколько я помню, это вызывает другую проблему, потому что, если вы вернетесь к своему приложению из списка недавних, Android запустится ActivityA так же, как в первый раз (т.е.: с дополнениями) так что он думает, что запускается с Notification... - person David Wasser; 19.01.2017
comment
В этом случае вам также необходимо проверить, установлен ли Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY в ActivityA, и тогда вы знаете, что приложение было запущено из списка недавних, и вы можете игнорировать дополнительные функции, поскольку на самом деле оно не запускается из уведомления. - person David Wasser; 19.01.2017
comment
Неплохо подмечено. Я попробую. И что вы думаете о решении, которое я разместил, где я создаю новый стек задач? - person alvaro torrico; 19.01.2017
comment
Если ваше приложение уже запущено, и вы нажимаете на Notification, который вы создали с помощью TaskStackBuilder, задача сбрасывается (это означает, что все, что делал пользователь, теряется, поскольку все действия в существующей задаче завершены. Если это нормально для вас , тогда вы, вероятно, можете использовать свое решение.По этой причине я держусь подальше от TaskStackBuilder. - person David Wasser; 19.01.2017

Я нашел решение, которое соответствует тому, что я ожидаю. Когда я получаю уведомление, я создаю новый стек задач с моей основной активностью вверху:

Intent intent = new Intent(this, ActivityB.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ActivityB.class);
stackBuilder.addNextIntent(intent);

PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

Теперь я также могу удалить переопределенную проверку кнопки HOME в действии B:

// This can be now removed
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (id == android.R.id.home) {
    Intent intent = new Intent(ActivityB.this, ActivityA.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}
person alvaro torrico    schedule 19.01.2017

Вместо этого вы можете использовать флаг FLAG_ACTIVITY_REORDER_TO_FRONT, который только изменит порядок действий, вместо FLAG_ACTIVITY_CLEAR_TOP, который удалит другие действия поверх него.

Например, при использовании FLAG_ACTIVITY_REORDER_TO_FRONT

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

вы можете перейти по этой ссылке: https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT

person Rami Jarrar    schedule 19.01.2017
comment
Думаю, это не решит проблему. Если приложение закрыто, у меня нет задач для изменения порядка, поэтому я получу такое же поведение, верно? - person alvaro torrico; 19.01.2017