Удаление стека заданий

У меня 3 занятия: A-> B-> C

Пользователь начинает с действия A. При переходе к B он может нажать назад и вернуться к A. Но ... Когда пользователь переходит к C из B. Я хочу, чтобы A и B были удалены, и пользователь выйдет из приложения, щелкнув обратно.

Я пытался:

Intent intent = new Intent(B.this, C.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

но на спине он все еще идет к B. Если это так:

Intent intent = new Intent(VerifyPhoneActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();

Пользователь возвращается к A, так что .. Это не то, что мне нужно.

попробуйте использовать Intent.FLAG_ACTIVITY_CLEAR_TASK вместо Intent.FLAG_ACTIVITY_CLEAR_TOP при запуске активности C и используйте finish() только для возврата из активности C.

Amrdroid 08.12.2018 20:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
46
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Запустите активность B с startActivityForResult():

Intent intent = new Intent(A.this, B.class);
startActivityForResult(intent, 100);

и переопределить в классе AstartActivityForResult():

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == 100) {
        if (resultCode == 1) {
            finish();
        }
    }
}

Теперь в классе B установите результат, который будет отправлен обратно в действие A:

Intent intent = new Intent(VerifyPhoneActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
setResult(1);
finish();

Заменить onBackPressed() в Activity C

@Override
public void onBackPressed() {
    finishAffinity();
}

Это приведет к завершению работы всех Activity, работающих в одной задаче. Если пользователь снова запустит приложение, нажав на него в окне недавних задач, отобразится Activity A.

Если я вас правильно понял, вы можете добиться этого с помощью SharedPreferences:

В вашей деятельности A добавьте это:

public class ActivityA extends AppCompatActivity {

SharedPreferences prefs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);

    if (savedInstanceState == null){
        SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
        editor.putBoolean("CloseApp", false);
        editor.commit();
    }

}

@Override
protected void onResume() {
    super.onResume();
    boolean finish = prefs.getBoolean("CloseApp", false);
    if (finish){
        this.finish();
    }
}

В действии B:

public class ActivityB extends AppCompatActivity {

SharedPreferences prefs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);

    prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);

}

@Override
protected void onResume() {
    super.onResume();

    boolean finish = prefs.getBoolean("CloseApp", false);
    if (finish){
        this.finish();
    }
}

И действие C:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_third);

    SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
    editor.putBoolean("CloseApp", true);
    editor.commit();
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    this.finish();
}

Это должно сработать.

вы можете просто написать это в Activity C, если ваше приложение работает с JELLY_BEAN и выше.

  @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        finishAffinity();
    }

если ваше приложение работает под JELLY_BEAN, вы можете использовать это решение:

Действие C:

   @Override
    public void onBackPressed() {
        Intent i = new Intent(C.this,A.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.putExtra("BackFromC",true);
        startActivity(i);
        super.onBackPressed();
    }

Действие A в onCreate:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);

        if (getIntent() != null){
            if (getIntent().getBooleanExtra("BackFromC",false)){
                finish();
            }
        }

        ... your Code 
    }
Ответ принят как подходящий

100% рабочий. попробуйте запустить Activity C вот так. Намерение намерения = новое намерение (это, ActivityC.class); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity ();

Другие вопросы по теме