Поведение стека активности, когда активность запускается из виджета
У меня есть две работы. Давайте назовем их ActivityA
а также ActivityB
, Активность А отмечена singleTask
в файле манифеста. Я могу начать ActivityB
от ActivityA
используя простой startActivity
звонок (нет Intent
флаги используются). Также я могу начать ActivityC
от ActivityA
и начать ActivityB
из него (также используя "простой" Intents
).
ActivityB
есть кнопка, которая выполняет этот код:
Intent intent = new Intent(ActivityB.this,
ActivityA.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
У меня также есть виджет, который может начать ActivityA
используя этот код:
Intent aIntent = new Intent(context, ActivityA.class);
aIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
aIntent, 0);
А также это может начаться ActivityB
из элементов сетки:
Intent bIntent = new Intent(context, ActivityB.class);
PendingIntent bPendingIntent = TaskStackBuilder.create(context)
.addNextIntent(aIntent).addNextIntent(bIntent )
.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
Если я начну ActivityA
от запуска, начать ActivityB
от него (или ActivityA
->ActivityC
->ActivityB
) - Я могу вернуться к ActyvityA
(или же ActivityC
) с помощью кнопки назад или кнопки в ActivityB
(описано выше) и ActivityA
не воссоздан. Это нормально.
Проблема в том, что если я начну ActivityB
из виджета и использовать кнопку назад или кнопку в ActivityB
(описано выше) ActivityA
воссоздается и становится единичным экземпляром в стеке.
Я хочу иметь возможность управлять этими двумя действиями так, как ActivityA
всегда является корневым и НЕ РЕКРЕЦИРУЕТСЯ, если он уже запущен.
1 ответ
Вы не можете сделать это с помощью TaskStackBuilder
, Вы можете избежать использования TaskStackBuilder
если вы можете найти способ убедиться, что ActivityB
никогда не запускается в задачу, если ActivityA
уже там. Таким образом, когда ActivityB
возвращается к ActivityA
, случай ActivityA
не будет воссоздан.
Чтобы решить эту проблему, вместо запуска ActivityB
прямо из виджета, вы должны запустить ActivityA
и передать дополнительный, который говорит ActivityA
что вы хотите запустить ActivityB
:
Intent bIntent = new Intent(context, ActivityA.class);
bIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_NEW_TASK);
bIntent.putExtra("launchActivityB", true);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
bIntent, 0);
В обоих onCreate()
а также onNewIntent()
из ActivityA
, проверьте наличие лишнего, и если оно есть, вы должны запустить ActivityB
немедленно.