Подтвердить что ты не робот

TaskStackBuilder и дополнительные функции для заднего стека

Я пытаюсь использовать TaskStackBuilder с уведомлениями, чтобы создать задний стек для кнопки "Назад", чтобы пройти. Обычный поток моего приложения:

  • Действие A запускается из запуска.
  • Пользователь выбирает элемент из A, который запускает B с дополнительными функциями для загрузки.
  • Пользователь выбирает элемент из B, это запускает C с дополнительными функциями для загрузки.

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

Мой текущий код TaskStackBuilder:

TaskStackBuilder sBuilder = TaskStackBuilder.create( this );
sBuilder.addParentStack( ActivityC.class );
sBuilder.addNextIntent( launchIntent );

pIntent = sBuilder.getPendingIntent( 0, PendingIntent.FLAG_ONE_SHOT );

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

4b9b3361

Ответ 1

Эта строка:

sBuilder.addParentStack( ActivityC.class );

добавляет всех родителей, объявленных для ActivityC в AndroidManifest.xml в <meta-data>. Я не знаю, что это, я не использовал его. Я сомневаюсь, что вам это нужно.

Эта строка добавляет намерение к массиву:

sBuilder.addNextIntent(launchIntent);

тогда массив намерений используется для создания PendingIntent, возможно с PendingIntent.getActivities, я не смог найти реализацию, которая затем начинается где-то с Context.startActivities.

Мне кажется, вам просто нужно создать набор намерений, там вы можете добавить дополнительные функции:

Intent activityA = new Intent(context, ActivityA.class);
activityA.putExtra(key, valueA);
Intent activityB = new Intent(context, ActivityB.class);
activityB.putExtra(key, valueB);
Intent activityC = new Intent(context, ActivityC.class);
activityC.putExtra(key, valueC);

и добавьте их в конструктор:

sBuilder.addNextIntent(activityA);
sBuilder.addNextIntent(activityB);
sBuilder.addNextIntent(activityC);
pIntent = sBuilder.getPendingIntent( 0, PendingIntent.FLAG_ONE_SHOT );

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

Ответ 2

Я нашел другой способ решить эту проблему: используйте метод TaskStackBuilder.editIntentAt(int)

ех.

Intent intentC = new Intent(context, ActivityC.class);
intentC.putExtra(key, valueC);

TaskStackBuilder sBuilder = TaskStackBuilder.create(this)
    .addParentStack(ActivityB.class)
    .addParentStack(ActivityC.class)
    .addNextIntent(intentC);

Intent intentA = sBuilder.editIntentAt(0);
intentA.putExtra(key, value);
Intent intentB = sBuilder.editIntentAt(1);
intentB.putExtra(key, value);

Ответ 3

Я боролся с этим. Мое исследование привело к следующему решению (очень похоже на @pawelzieba, но с одним важным удалением):

Intent activityA = new Intent(context, ActivityA.class);
activityA.putExtra(key, valueA);
Intent activityB = new Intent(context, ActivityB.class);
activityB.putExtra(key, valueB);
Intent activityC = new Intent(context, ActivityC.class);
activityC.putExtra(key, valueC);

TaskStackBuilder sBuilder = TaskStackBuilder.create(this)
    .addNextIntent(activityA);
    .addNextIntent(activityB);
    .addNextIntent(activityC);
PendingIntent pIntent = sBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT );

Обратите внимание, что вы не должны изменять манифест с родительскими ассоциациями, и вы не хотите использовать:

sBuilder.addParentStack( ActivityC.class );

иначе вы получите повторения ActivityA и ActivityB во вновь созданной задаче, которая имеет намерения без дополнительных функций. Если вам не нужно передавать намерения с помощью дополнительных функций, вы можете добавить родительские ассоциации в манифест и вызвать addParentStack().