Android – ¿Cómo sobrescribir el botón “Atrás” para que no termine () mi actividad?

Actualmente tengo una actividad que cuando se muestra una notificación también se mostrará en la barra de notificaciones.

Esto es para que cuando el usuario presione Inicio y la actividad se mantenga en segundo plano puedan regresar a la actividad a través de la notificación.

El problema surge cuando un usuario presiona el botón Atrás, mi actividad se destruye pero la notificación se mantiene porque quiero que el usuario pueda presionar hacia atrás pero aún así poder acceder a la actividad a través de la notificación. Pero cuando un USUARIO prueba esto, obtengo Null Pointers porque está intentando iniciar una nueva actividad en lugar de recuperar la anterior.

Entonces, esencialmente, quiero que el botón Atrás funcione exactamente igual que el botón de Inicio y así es como lo he intentado hasta ahora:


@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (Integer.parseInt(android.os.Build.VERSION.SDK) < 5 && keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { Log.d("CDA", "onKeyDown Called"); onBackPressed(); } return super.onKeyDown(keyCode, event); } public void onBackPressed() { Log.d("CDA", "onBackPressed Called"); Intent setIntent = new Intent(Intent.ACTION_MAIN); setIntent.addCategory(Intent.CATEGORY_HOME); setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(setIntent); return; } 

Sin embargo, el código anterior parece permitir que se destruya mi actividad. ¿Cómo puedo evitar que mi actividad se destruya cuando se presiona el botón Atrás?

Elimine su oyente clave o devuelva true cuando tenga KEY_BACK .

Solo necesita lo siguiente para capturar la tecla de retroceso (asegúrese de no llamar a super en onBackPressed() ).

Además, si planeas tener un servicio ejecutándose en segundo plano, asegúrate de mirar startForeground() y asegúrate de tener una notificación en curso o, si no, Android matará tu servicio si necesita liberar memoria.

 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (Integer.parseInt(android.os.Build.VERSION.SDK) > 5 && keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { Log.d("CDA", "onKeyDown Called"); onBackPressed(); return true; } return super.onKeyDown(keyCode, event); } @Override public void onBackPressed() { Log.d("CDA", "onBackPressed Called"); Intent setIntent = new Intent(Intent.ACTION_MAIN); setIntent.addCategory(Intent.CATEGORY_HOME); setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(setIntent); } 

Fue más fácil implementarlo solo con una línea de código:

 @Override public void onBackPressed() { moveTaskToBack(true); } 

Creo que lo que quieres es no anular el botón Atrás (eso no parece una buena idea, el sistema operativo Android define ese comportamiento, ¿por qué cambiarlo?), Sino usar el Ciclo de vida de la actividad y conservar tus configuraciones / datos en el evento onSaveInstanceState (Bundle) .

 @Override onSaveInstanceState(Bundle frozenState) { frozenState.putSerializable("object_key", someSerializableClassYouWantToPersist); // etc. until you have everything important stored in the bundle } 

Luego usa onCreate (Bundle) para sacar todo de ese paquete persistente y recrear su estado.

 @Override onCreate(Bundle savedInstanceState) { if(savedInstanceState!=null){ //It could be null if starting the app. mCustomObject = savedInstanceState.getSerializable("object_key"); } // etc. until you have reloaded everything you stored } 

Considere el código psuedo anterior para indicarle la dirección correcta. Leer en el ciclo de vida de la actividad debería ayudarlo a determinar la mejor manera de lograr lo que está buscando.

simplemente haz esto …

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

comentar el //super.onBackPressed (); hará el truco

Prueba esto:

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

En caso de que quiera manejar el comportamiento del botón Atrás (en la parte inferior del teléfono) y el botón de inicio (el que está a la izquierda de la barra de acciones), esta actividad personalizada que estoy usando en mi proyecto puede ayudarlo .

 import android.os.Bundle; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; /** * Activity where the home action bar button behaves like back by default */ public class BackActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupHomeButton(); } private void setupHomeButton() { final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: onMenuHomePressed(); return true; } return super.onOptionsItemSelected(item); } protected void onMenuHomePressed() { onBackPressed(); } } 

Ejemplo de uso en su actividad:

 public class SomeActivity extends BackActivity { // .... @Override public void onBackPressed() { // Example of logic if ( yourConditionToOverride ) { // ... do your logic ... } else { super.onBackPressed(); } } }