Posso forzare il pulsante Indietro di Android a fare due passi indietro nello stack Attività?

So che posso ignorare il metodo onKeyDown , ma voglio Back to do it’s thing, solo due volte!

FirstActivity

 Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent); 

SecondActivity

 int REQUEST_CODE = 123 Intent intent = new Intent(SecondActivity.this, ThirdActivity.class); startActivityForResult(intent, REQUEST_CODE); 

(per rendere questo pedagogico c’è più codice per questa attività sotto)

ThirdActivity

 @Override public void onBackPressed() { // Semi ugly way of supporting that back button takes us back two activites instead of the usual one. setResultOkSoSecondActivityWontBeShown(); finish(); } private void setResultOkSoSecondActivityWontBeShown() { Intent intent = new Intent(); if (getParent() == null) { setResult(Activity.RESULT_OK, intent); } else { getParent().setResult(Activity.RESULT_OK, intent); } } 

SecondActivity (di nuovo)

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 123) { if (resultCode == RESULT_OK) { finish(); } } } 

Ci sto pensando in questo modo:

 A -> B -> C 

A, B, C attività.

Non puoi fare un back due volte poiché il primo onKeyDown() sarà eseguito in C e il secondo dovrebbe essere eseguito in B.

Non so perché stai cercando di fare, ma qui ci sono alcune opzioni.

  1. Usando l’ android:noHistory tag android:noHistory :

    Forse la tua attività C sta facendo qualcosa che non ha bisogno di una vista ed è per questo che vuoi tornare due volte.

  2. Usando un intento. Qualcosa di simile a:

     Intent intent = new Intent(C.this, A.class); startActivity(intent); 
  3. Utilizzando il finishActivityFromChild() . Non l’ho mai provato, ma sembra che tu possa usarlo per decidere cosa fare in B a seconda di come è finito C.

| * | Tornando indietro di una schermata o terminando l’attività:

 finish(); 

| * | Tornando a più di una schermata:

Puoi tornare a qualsiasi schermata di cui hai bisogno utilizzando l’intento e utilizzare i flag per impedire di tornare alla stessa schermata:

 Intent gotoScreenVar = new Intent(goFromScreenCls.this, goToScreenCls.class); gotoScreenVar.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(gotoScreenVar);