finish() не срабатывает при быстром переключении активити

Помогите разобраться, почему не срабатывает finish() при быстром переключении активити. Если переключать с интервалом, то по кнопке back выходит в главное меню и оттуда можно закрыть приложение, а если быстро попереключать активити, то при нажатии на кнопку back открывается главное меню, но при нажатии на back, чтобы выйти, снова открываются предыдущие активити.

Так делаю для кнопок вперед/назад:

public void right (View v){
        Intent intent = new Intent(Colors.this,Colors2.class);
        startActivity(intent);
        overridePendingTransition(R.anim.leftr, R.anim.rightr);
        finish();

    }

    public void left (View v){
        Intent intent = new Intent(Colors.this,Pets.class);
        startActivity(intent);
        overridePendingTransition(R.anim.left, R.anim.right);
        finish();

    }

// выход в главное меню
    @Override
        public void onBackPressed () {
            Intent intent = new Intent(Colors.this,Stage.class);
            startActivity(intent);
            finish();
        }

Ответы (1 шт):

Автор решения: Alex_Skvortsov

Мне встречались несколько способов решения такой проблемы, и, к сожалению, иногда не срабатывает ни один.

  1. YourActivity.this.finish(); вместо finish(); Где YourActivity - класс завершающейся активности
  2. ((Activity) this).finish(); опять же вместо finish();
  3. Создать отдельный метод в своей Activity:

    public void killSelf() {
        this.finish();
    }
    

    И вызывать его вместо finish();

  4. Для API >= 21 можно вызвать другой метод:

    finishAndRemoveTask();
    
  5. Если Вы передаете какие-то данные через Intent, то нужно помнить, что объем передаваемых данных не должен превышать 1 Мб в соответствии с документацией. С учетом хранения служебной информации - лучше не выходить за пределы 500Кб.

  6. FLAG_ACTIVITY_CLEAR_TASK

    startActivity(intent
        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    );
    

    С такими флагами finish(); будет не нужен, однако уничтожены будут вообще все экраны кроме вызываемого!

→ Ссылка