Как управлять поведением стека действий в Android на основе динамических идентификаторов?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как управлять поведением стека действий в Android на основе динамических идентификаторов?

Сообщение Anonymous »

У меня есть один ActivityA, который содержит определенный идентификатор в данных намерения, один ActivityB, открытый из этого ActivityA, и ActivityB также может открыть тот же ActivityA с тем же или другим идентификатором. Видя, что открытие действий таким образом может привести к бесконечности действий в стеке, мне нужно управлять стеком следующим образом:
  • Пользователь открывает ActivityA с идентификатором 1, затем открывает ActivityB оттуда. Итак,
    стек будет таким: ActivityA(id: 1) → ActivityB
  • Затем из ActivityB пользователь открывает ту же операцию ActivityA с идентификатором 1 и стек будет выглядеть так: ActivityA(id: 1). Обратите внимание, что ActivityB был просто
    вытащен из стека.
Я знаю, что могу добиться такого поведения, просто используя android:launchMode="singleTask"< /код>. Но моя проблема в том, что пользователь открывает ActivityA с другим идентификатором. Итак, вот желаемое второе поведение:
  • Пользователь открывает ActivityA с идентификатором 1, затем оттуда открывает ActivityB. Стек теперь будет таким: ActivityA(id: 1) → ActivityB
  • Теперь из ActivityB пользователь открывает ActivityA с идентификатором 2, и
    стек должен быть например: ActivityA(id: 1) → ActivityB → ActivityA(id: 2). Обратите внимание, что вместо того, чтобы вытаскивать ActivityB, он остается в стеке и добавляет еще один экземпляр ActivityA, но теперь с другим идентификатором.
В этих двух сценариях Мне нужно два разных поведения в зависимости от идентификатора ActivityA. И у меня есть одно ограничение: у меня нет контроля над ActivityB, поэтому я не могу вносить какие-либо изменения в ActivityB.
PS: ActivityB открывает ActivityA через глубокую ссылку.
Попытки
Я мог бы добиться аналогичного поведения, используя

Код: Выделить всё

android:documentLaunchMode="intoExisting"
android:launchMode="singleTask"
но он создает новую задачу каждый раз, когда открывается ActivityA, и это будет неприятно для пользователя.
Использование TaskAffinity будет также создаю новую задачу, но я не могу себе этого позволить.
Обновить
Моя текущая попытка:
AndroidManifest Код ActivityA

Код: Выделить всё

private val idsInStack = mutableSetOf()

class ActivityA : AppCompatActivity(R.layout.activity_a) {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

val id = intent.data?.getQueryParameter("QUERY_ID")
if (idsInStack.contains(id)) {
val intent = Intent(this, ActivityA::class.java)
intent.data = this.intent.data
intent.addFlags(
Intent.FLAG_ACTIVITY_CLEAR_TOP or
Intent.FLAG_ACTIVITY_SINGLE_TOP or
Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP
)
startActivity(intent)
finish()
}

id?.let { idsInStack.add(it) }

diInjection()
}
}
PS: Activity запускает Activity через глубокую ссылку и не добавляет флагов к намерению.

Подробнее здесь: https://stackoverflow.com/questions/787 ... ynamic-ids
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»