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 не знает, какой идентификатор требуется запросить. Есть ли способ получить эту дополнительную информацию в задний стек или я застрял?
Ответы
Ответ 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().