Anular el botón Atrás para que funcione como el botón de inicio

Al presionar el botón Atrás, me gustaría que mi aplicación entre en el estado detenido, en lugar del estado destruido.

En los documentos de Android dice:

… no todas las actividades tienen el comportamiento que se destruyen cuando se presiona ATRÁS. Cuando el usuario comienza a reproducir música en la aplicación Música y luego presiona ATRÁS, la aplicación anula el comportamiento normal de la espalda, lo que impide que se destruya la actividad del reproductor, y continúa reproduciendo música, aunque su actividad ya no sea visible

¿Cómo replico esta funcionalidad en mi propia aplicación?

Creo que debe haber tres posibilidades …

  1. Capture presionar el botón Atrás (como se muestra a continuación) y luego llame a los métodos que llame el botón de inicio.

    @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK)) { Log.d(this.getClass().getName(), "back button pressed"); } return super.onKeyDown(keyCode, event); } 
  2. Capture el botón Atrás y presione el botón de inicio.

  3. Capture el botón Atrás, presione y luego inicie una Actividad de la pantalla de inicio, colocando de manera efectiva la Actividad de mi aplicación en el estado detenido.

Editar: conozco los servicios y estoy usando uno en la aplicación con la que está relacionado este problema. Esta pregunta es específicamente sobre poner la Actividad en el estado detenido en lugar del estado destruido al presionar el botón Atrás.

La mayoría de las veces necesita crear un Servicio para realizar algo en segundo plano, y su Activity visible simplemente controla este Service . (Estoy seguro de que el reproductor de música funciona de la misma manera, por lo que el ejemplo en los documentos parece un poco engañoso). Si ese es el caso, su Activity puede finish como de costumbre y el Service seguirá ejecutándose.

Un enfoque más simple es capturar el botón Back y presionar moveTaskToBack (true) de la siguiente manera:

 // 2.0 and above @Override public void onBackPressed() { moveTaskToBack(true); } // Before 2.0 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { moveTaskToBack(true); return true; } return super.onKeyDown(keyCode, event); } 

Creo que la opción preferida debería ser que una actividad termine normalmente y pueda recrearse, por ejemplo, leyendo el estado actual de un servicio si es necesario. Pero moveTaskToBack se puede usar como una alternativa rápida en ocasiones.

NOTA : según lo señalado por Dave debajo de Android 2.0 introdujo un nuevo método onBackPressed , y estas recomendaciones sobre cómo manejar el botón Atrás.

Usa el siguiente código:

 public void onBackPressed() { Intent intent = new Intent(); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); } 

Si desea ver el botón Atrás, eche un vistazo a esta publicación en el blog para desarrolladores de Android . Cubre la manera más fácil de hacerlo en Android 2.0 y la mejor manera de hacerlo para una aplicación que se ejecuta en 1.x y 2.0.

Sin embargo, si su actividad se detuvo, aún puede ser eliminada dependiendo de la disponibilidad de la memoria en el dispositivo. Si desea que un proceso se ejecute sin UI, debe crear un Service . La documentación dice lo siguiente sobre Servicios:

Un servicio no tiene una interfaz de usuario visual, sino que se ejecuta en segundo plano por un período de tiempo indefinido. Por ejemplo, un servicio puede reproducir música de fondo cuando el usuario atiende otros asuntos, o puede obtener datos a través de la red o calcular algo y proporcionar el resultado a las actividades que lo necesitan.

Esto parece apropiado para sus requisitos.

intenta anular void onBackPressed() definido en la clase android.app.Activity.

si ayuda a otra persona, tuve una actividad con 2 diseños que activaba y desactivaba para tener visibilidad, tratando de emular un tipo de estructura de página1> página2. si estaban en la página 2 y presionaron el botón Atrás, quería que volvieran a la página 1; si presionaban el botón Atrás en la página 1, seguirían funcionando normalmente. Es bastante básico pero funciona

 @Override public void onBackPressed() { // check if page 2 is open RelativeLayout page2layout = (RelativeLayout)findViewById(R.id.page2layout); if(page2layout.getVisibility() == View.VISIBLE){ togglePageLayout(); // my method to toggle the views return; }else{ super.onBackPressed(); // allows standard use of backbutton for page 1 } } 

Espero que ayude a alguien, ¡salud!

Ejemplo de trabajo …

Asegúrese de no llamar a super.onBackPressed ();

 @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); } 

De esta forma, su Botón Atrás actúa como el botón Inicio. No termina tu actividad, sino que la lleva al fondo

La segunda forma es llamar a moveTaskToBack(true); en onBackPressed y asegúrese de eliminar super.onBackPressed

Aún mejor, ¿qué tal OnPause () :

Se llama como parte del ciclo de vida de la actividad cuando una actividad se pasa al segundo plano, pero aún no se ha eliminado. La contraparte de onResume ().

Cuando la actividad B se lanza al frente de la actividad A, esta callback se invocará en A. B no se creará hasta que A’s onPause () regrese, así que asegúrese de enter code here no hacer nada extenso aquí.

Esta callback se usa principalmente para guardar cualquier estado persistente que la actividad esté editando y para asegurarse de que no se pierda nada si no hay suficientes recursos para comenzar la nueva actividad sin matar primero a esta.

Este también es un buen lugar para hacer cosas como detener animaciones y otras cosas que consumen una cantidad notable de CPU para pasar a la siguiente actividad lo más rápido posible o para cerrar recursos de acceso exclusivo como la cámara.

Reemplazar onBackPressed () después de Android 2.0. Como

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

He usado @Mirko N. answser usando el nuevo Custom EditText

  public class EditViewCustom extends EditText { Button cancelBtn; RelativeLayout titleReleLayout; public EditViewCustom(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public EditViewCustom(Context context, AttributeSet attrs) { super(context, attrs); } public EditViewCustom(Context context) { super(context); } public void setViews(Button cancelBtn,RelativeLayout titleReleLayout){ this.cancelBtn = cancelBtn; this.titleReleLayout = titleReleLayout; } @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { Log.d("KEYCODE_BACK","KEYCODE_BACK"); cancelBtn.setVisibility(View.GONE); this.setFocusableInTouchMode(false); this.setFocusable(false); titleReleLayout.setVisibility(View.VISIBLE); return super.onKeyPreIme(keyCode, event); } return super.onKeyPreIme(keyCode, event); } } 

Luego configura los datos de tu actividad

  searchEditView.setViews(cancelBtn, titleRelativeLayout); 

Gracias.