Anular el botón atrás para actuar como botón de inicio


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

En los documentos de Android dice:

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

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

Creo que debe haber tres posibilidades...

  1. Capture el botón atrás presione (como abajo) y luego llame a cualquier método(s) que el botón de inicio llame.

    @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. Captura la pulsación del botón atrás y luego falsifica una pulsación del botón de inicio.

  3. Captura el botón atrás pulse, a continuación, iniciar una actividad de la pantalla de inicio, poniendo efectivamente la actividad de mi aplicación en el estado detenido.

Editar: Conozco servicios y estoy usando uno en la aplicación a la que está relacionado este problema. Esta pregunta es específicamente acerca de poner la Actividad en el estado detenido en lugar del estado destruido al presionar el botón atrás.

Author: Real KEK, 2010-01-04

9 answers

La mayor parte del tiempo necesitas crear un Servicio para realizar algo en segundo plano, y tu visible Activity simplemente controla esto 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, entonces su Activity puede finish como de costumbre y el Service seguirá funcionando.

Un enfoque más simple es capturar el botón Back presionar y llamar 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);
}

I piense que la opción preferida debería ser que una Actividad termine normalmente y pueda recrearse a sí misma, por ejemplo, leyendo el estado actual de un Servicio si es necesario. Pero moveTaskToBack se puede utilizar como una alternativa rápida en ocasiones.

NOTA : como señaló Dave a continuación, Android 2.0 introdujo un nuevo método onBackPressed, y estas recomendaciones sobre cómo manejar el botón Atrás.

 328
Author: Mirko N.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-06 22:34:31

Utilice el siguiente código:

public void onBackPressed() {    
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}
 43
Author: Aniruddh Ambarkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-18 21:02:08

Si quieres atrapar el botón Atrás, echa un vistazo a esta publicación en el Blog de Desarrolladores de Android. Cubre la forma más fácil de hacer esto 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 detiene, todavía puede ser eliminada dependiendo de la disponibilidad de memoria en el dispositivo. Si desea que un proceso se ejecute sin interfaz de usuario, debe crear un Service. La documentación dice lo siguiente sobre los Servicios:

Un servicio no tiene una interfaz de usuario visual, sino que se ejecuta en segundo plano durante un período de tiempo indefinido. Por ejemplo, un servicio puede reproducir música de fondo mientras 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.

Estos parecen apropiados para sus necesidades.

 22
Author: Dave Webb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-04 15:56:05

Intenta anular void onBackPressed() definido en Android.app.Clase de actividad.

 17
Author: m-szalik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-30 03:45:58

Si ayuda a alguien más, tuve una actividad con 2 diseños que activé y desactivé para visibilty, tratando de emular una especie de estructura de page1 > page2. si estaban en la página 2 y presionaron el botón atrás, quería que volvieran a la página 1, si presionaron el botón atrás en la página 1, todavía debería funcionar de manera normal. 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, saludos

 13
Author: craigk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-07 00:18:26

Ejemplo de trabajo..

Asegúrate 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 manera el Botón Atrás actúa como botón de Inicio . No termina su actividad, pero llevarlo a fondo

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

 8
Author: Xar E Ahmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-27 06:36:07

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

Llamado como parte del ciclo de vida de la actividad cuando una actividad está pasando a segundo plano, pero (todavía) no ha sido eliminada. La contraparte de onResume().

Cuando se inicia la actividad B delante de la actividad A, esta devolución de llamada se invocará en A. B no se creará hasta que se devuelva onPause() de A, así que asegúrese deenter code here no hacer nada largo aquí.

Esta devolución de llamada se usa principalmente para guardar cualquier estado persistente de la actividad es editar y asegurarse de que no se pierde nada si no hay suficientes recursos para iniciar la nueva actividad sin primero matar 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 hacer el cambio a la siguiente actividad lo más rápido posible, o para cerrar recursos que son acceso exclusivo, como la cámara.

 0
Author: user1524315,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-18 05:25:57

Anular onBackPressed() después de android 2.0. Tales como

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}
 0
Author: SaiLiu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-25 13:58:27

Tengo uso @Mirko N. answser usando hecho el nuevo EditText personalizado

 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 establece los datos de tu actividad

 searchEditView.setViews(cancelBtn, titleRelativeLayout);

Gracias.

 -1
Author: Sameer Z.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-22 10:51:09