Android: очистить старый экземпляр активности из стека истории - PullRequest
2 голосов
/ 20 февраля 2020

У меня есть следующий простой сценарий:

  • Одна активность называется ListCarsActivity.kt , где отображается список автомобилей. Когда пользователь нажимает кнопку FloatingActionButton, он открывает другое действие под названием AddCarActivity.kt
  • Когда пользователь нажимает кнопку Добавить автомобиль , я начинаю новое намерение: go к начальному действию ListCarsActivity.kt, где теперь отображается добавленный автомобиль.

Проблема : с этого момента, когда я нажимаю кнопку "Назад", отображается ListCarsActivity. во второй раз.

Как очистить старую запись ListCarsActivity из стека истории?

enter image description here

Ответы [ 5 ]

2 голосов
/ 20 февраля 2020

Позвоните вашему AddCarActivity.kt Активности, как показано ниже внутри вашего ListCarsActivity.kt

val intent = Intent(mContext, AddCarActivity.class);
startActivityForResult(intent, 1); //Use any request code

Теперь для кода выше то, что startActivityForResult делает, это то, что это Намерение получить данные от какого-либо другого действия или источника (например, камеры, контактов и т. д. c)

Теперь, когда вся работа выполнена в вашем AddCarActivity.kt , вы можете все ниже намерение вернуть результат

                Intent intent = getIntent();
                intent.putExtra("key", data); // if you wanted to get data 
                setResult(RESULT_OK, intent);
                finish();

А внутри вашего ListCarsActivity.kt вам нужно добавить onActivityResult , который будет получать данные from AddCarActivity.kt

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    try {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK) {
            if (requestCode == 1) { //Your request code here
                Object obj = data.getParcelableExtra("key");
                 //Do as per your needs

            }
        }

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

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

Попробуйте и дайте мне знать, сработало ли это для вас.

0 голосов
/ 21 февраля 2020

Больше не звоните ListCarsActivity, когда пользователь добавляет кнопку "автомобиль", просто поставьте finish() Поскольку ваше первое занятие, вы только что начали занятие ListCarsActivity.kt, но еще не завершено, оно уже в стеке. Если вы перезвоните ListCarsActivity.kt, то в вашем стеке ваша активность открывается два раза.

0 голосов
/ 20 февраля 2020

Вы должны запустить AddCarActivity с помощью метода startActivityForResult, а затем вы должны установить результат с помощью метода setResult в AddCarActivity, который возвращает вас к ListCarsActivity без повторного запуска

Официальная документация : https://developer.android.com/training/basics/intents/result

https://developer.android.com/reference/android/app/Activity#setResult (int,% 20 android .content.Intent)

0 голосов
/ 20 февраля 2020

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

В вашем ListCarsActivity, нажав floatingButton, вы начинаете новое действие AddCarActivity. После этого, нажав на кнопку «Добавить автомобиль» , вы можете сделать логи сохранения / записи c и закрыть (finish()) это (AddCarActivity).

Это предотвратит повторный запуск того же действия (ListCarsActivity). Кроме того, если вы закроете (finish()) ListCarsActivity и если пользователь нажмет back с AddCarActivity, приложение закроется (учитывая, что есть только два действия). Это определенно то, что вам не нужно.

Скорее, вы можете реализовать метод onResume в вашем ListCarsActivity, чтобы обновить sh список новыми и обновленными данными. Эта же функция будет вызываться, когда пользователь нажимает «Добавить автомобиль» и AddCarActivity закрывается. Следовательно, не было бы необходимости снова запускать действие.

0 голосов
/ 20 февраля 2020

используйте finish() после startActivity(intent) до конца sh действия, в котором вы запускаете другое действие

...