Nano Hash - криптовалюты, майнинг, программирование

Android: как закрыть одно действие при обратном нажатии и весь задний стек при нажатии другой кнопки?

У меня есть этот сценарий, где у меня есть основное действие и действие статьи. Основное действие открывает действие статьи, затем, если вы нажмете связанную статью из действия статьи, оно снова откроет то же действие с запрошенной связанной статьей. Таким образом, в основном вы можете открыть 10 действий со статьями друг над другом и вернуться к каждому из них onBackPress(), пока снова не достигнете основного действия. Но клиенту также нужна кнопка, которая должна отправить вас прямо обратно к основному действию без необходимости повторного цикла через весь BackStack.

  • В основном у нас есть MA -> AA -> AA -> AA -> (...).
  • При нажатии «Назад» вы должны возвращаться назад, как MA ‹- AA ‹- AA ‹- AA последовательно через каждый новый экземпляр.
  • При нажатии кнопки Close All вы должны закрыть все экземпляры AA и вернуться прямо к MA.

P.S. Я не хочу потерять экземпляр MA. Он всегда должен быть в задней части стеллажа в качестве отправной точки.

Как мне это сделать?


  • Просто закройте действие AA, когда вы откроете следующее действие AA, что означает, что у вас есть только MA->только AA 04.12.2019
  • @Shane Нет, это именно то, чего не хочет клиент. Он хочет иметь возможность пройтись по каждому из мероприятий АА. 04.12.2019

Ответы:


1

вы можете создать функцию запуска для своей основной деятельности и добавить необходимые флаги в Intent для очистки обратного стека и вызвать эту функцию в onClick вашей кнопки. также, чтобы избежать нескольких экземпляров MainActivity, вы должны сделать его обеденный режим singleInstance или singleTop в своем манифесте. Для функции запуска у вас есть несколько способов реализации.

Первый способ: определите статический метод в вашей MainActivity, например, эта часть addFlags предназначена для очистки заднего стека при вызове MainActivity, если в этом нет необходимости, вы можете удалить его

companion object {
        @JvmStatic
        fun startActivity(context: Context) {
            val intent = Intent(context, KYCActivity::class.java).apply {
                addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or 
                     Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
            }
            context.startActivity(intent)
        }
    }

и вы можете вызвать его в прослушивателе нажатия кнопки

gotoHomeButton.setOnClickListener {
    MainActivity.startActivity(context)
}

второй способ: определить функцию расширения для запуска действий

inline fun <reified T: Activity> Context.startActivity() {
    startActivity(Intent(this, T::class.java).apply {
        addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or 
             Intent.FLAG_ACTIVITY_NEW_TASK)
    })
}

а затем вызовите функцию следующим образом

gotoHomeButton.setOnClickListener {
    startActivity<MainActivity>()
}

нет необходимости определять эти функции, вы можете просто создать новый экземпляр Intent в своих кнопках onClick, но мне это нравится.

ОБНОВЛЕНИЕ ОТ OP

По-видимому, это было так же просто, как добавить флаги (Intent.FLAG_ACTIVITY_CLEAR_TOP или Intent.FLAG_ACTIVITY_SINGLE_TOP) к действию AA в намерении при нажатии кнопки. Не нужно ничего добавлять в манифест.

04.12.2019
  • Но разве это не утечка памяти? Потому что вы снова запускаете MainActivity при нажатии кнопки goHomeButton? Если вы сделаете это 10 раз, разве вы не начнете 10 основных действий друг над другом? Или именно этому помешают эти флаги? 04.12.2019
  • нет, потому что вы делаете обеденный режим MainActivity singleInstance (в вашем манифесте, как я упоминал ранее), всегда будет только один экземпляр вашей активности 04.12.2019
  • Я попробую это и дам некоторые отзывы 04.12.2019
  • android:launchMode=singleInstance 04.12.2019

  • 2

    Вы должны вызвать намерение с флагом FLAG_ACTIVITY_CLEAR_TOP, чтобы удалить все другие действия в стеке.

    04.12.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..