Поведение стека активности, когда активность запускается из виджета

У меня есть две работы. Давайте назовем их 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 немедленно.

Другие вопросы по тегам