Actualmente tengo una Actividad que cuando se muestra una Notificación también se muestran en la barra de Notificaciones.

Esto es para que cuando el Usuario presiona el hogar y la Actividad se inserta en el fondo de que puedan volver 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 queda como yo quiero que el usuario sea capaz de prensa de la espalda, pero aún así ser capaz de conseguir a la Actividad a través de la Notificación. Pero cuando un USUARIO intenta esto puedo obtener Punteros Null como tratando de empezar una nueva actividad en lugar de traer de vuelta a la antigua.

Así que, esencialmente, quiero que el botón Atrás para actuar de la misma como el botón de Inicio y aquí es lo que 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 de arriba parece que todavía permitir que mi Actividad a ser destruido, ¿Cómo puedo dejar mi Actividad de ser destruido cuando se pulsa el botón atrás?

  • Hay una pregunta similar: stackoverflow.com/questions/2459848/…
  • Similar respuesta.. stackoverflow.com/questions/5914040/…
  • También creo que tienes que cambiar el código para ` si (Integer.parseInt(android.os.Construir.VERSIÓN.SDK) > 5, the <` debe convertirse en un >.
  • Incluso si se soluciona esto, usted todavía debe manejar la posibilidad de que el sistema matar a su aplicación, a la derecha? Quiero decir, el nulo caso es aún posible? O si el sistema mata a su aplicación por cualquier razón, que también quitar la notificación? Estoy pensando que esto debe ser un problema, ya que la finalidad de la notificación es existir incluso si la aplicación no.
  • Consulte aquí la aplicación de ejemplo de código freakyjolly.com/how-to-add-back-arrow-in-android-activity

7 Comentarios

  1. 255

    Eliminar su clave de escucha o de retorno true cuando usted tiene KEY_BACK.

    Usted sólo necesitará lo siguiente para coger la tecla atrás (asegúrese de no llamar super en onBackPressed()).

    También, si usted planea en tener un servicio que se ejecuta en segundo plano, asegúrate de buscar en startForeground() y asegúrese de tener una notificación en curso o bien Android va a matar a su servicio si es necesario para liberar memoria.

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

    Era más fácil de implementar sólo con una línea de código:

    @Override
    public void onBackPressed() {
       moveTaskToBack(true);
    }
    • Esto debe ser aceptado respuesta. Esto es exactamente lo que la pregunta está pidiendo y es el uso de limpiar construido en la funcionalidad.
    • Gracias 🙂 usted puede elaborar el concepto detrás de esto?
    • Usted simplemente reemplazar la onBackPressed() el evento, hacer que se mueva la actividad a la espalda.
    • Esta solución no va a traer a la actividad de nuevo cuando vuelva a iniciar la aplicación desde la pantalla de inicio (si no hay otra actividad en la tarea de la pila).
  3. 12

    Creo que lo que quiere no es para reemplazar el botón atrás (a la que no le parece una buena idea – sistema operativo Android que define el comportamiento, ¿por qué cambiarlo?), pero el uso de la La Actividad Del Ciclo De Vida De y persisten sus ajustes/datos en el onSaveInstanceState(Bundle) evento.

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

    A continuación, utilizar onCreate(Bundle) de sacar todo lo de que persistió paquete y volver a 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
    }

    Examinar el mencionado pseudo-código para que apunte en la dirección correcta. Leyendo en el La Actividad Del Ciclo De Vida De debe ayudarle a determinar la mejor manera para lograr lo que estás buscando.

    • Hola Kiswa, esto es cierto, no quiero cambiar el comportamiento predeterminado. He intentado usar el onSavedInstanceState y no fue a trabajar, pero creo que he descubierto mi error ahora. Gracias
    • Me he encontrado con al menos un par de situaciones donde quería simular el estándar de la Actividad de la pila de comportamiento sin que en realidad el inicio de nuevas Actividades. En estos casos, creo, es apropiado para reemplazar el valor predeterminado onBackPressed() de la conducta. En general, sin embargo, estoy de acuerdo: evitar primordial.
    • Estoy de acuerdo con @Matt. Actualmente estoy trabajando en una cruz de la plataforma de juego que utiliza el NDK. Como tal, es más fácil si todo es una sola actividad. Debido a esto, el valor predeterminado comportamientos del botón atrás es escapar de la aplicación, que no es lo que la mayoría de los usuarios esperan. Así que tuve que cambiar el valor predefinido comportamientos para realizar la actividad se comportan de manera diferente, como si el usuario hubiera ido a una actividad diferente, y sólo salir de la aplicación en ciertos circomstances.
    • No es el onSaveInstanceState y guardar los datos de una manera totalmente diferente a la pregunta?
    • usted está diciendo que en adición a onSaveInstanceState, también se debe poner el código que persiste la no-interfaz de usuario de datos de la aplicación, entonces estoy de acuerdo. Tan pronto como usted deje de primer plano, su aplicación podría ser asesinados sin previo aviso. Siempre debe guardar cualquier cosa que importa. Por otro lado, creo que la aplicación de métodos del ciclo de vida se denomina independientemente de qué técnica utilizar para ocultar app pero mantenerlo alrededor, por lo que no debería ser necesario agregar guardar lógica sólo para este caso. La aplicación necesita que el código en todos los lugares correctos independientemente.
  4. 11

    simplemente hacer esto..

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

    comentario de la //super.onBackPressed(); va a hacer el truco

    • Un útil la observación, pero esto no causa el botón atrás para no hacer nada en absoluto, como si estuviera roto? Que no es una buena cosa que hacer – confuso y molesto para los usuarios. En mi humilde opinión debe agregar la lógica de la otra respuesta, para actuar como botón de Inicio, tal como fue solicitado en la pregunta. La aceptación de respuesta menciona que fueron deliberadamente no llamar a super método.
    • Sí, tienes toda la razón. Se acaba de anular el botón atrás y no hacer nada hasta que pones un poco de lógica. Puede ser una condición de doble presione el botón para cerrar la aplicación o simplemente quieres desactivar una operación en curso (cuadro de diálogo de progreso), etc, pero su totalmente con el requisito.
  5. 2

    Sólo en el caso de querer manejar el comportamiento del botón atrás (en la parte inferior del teléfono) y el botón de inicio (la de la izquierda de la barra de acción), esta actividad personalizada estoy usando en mi proyecto te pueden ayudar.

    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();
            }
        }    
    }
  6. 0
    @Override
    public void onBackPressed() {
    //Put your code here.
    }
    
    //I had to go back to the dashboard. Hence,
    
    @Override
    public void onBackPressed() {
        Intent intent = new Intent(this,Dashboard.class);
        startActivity(intent);
    }
    Just write this above or below the onCreate Method(within the class)

Dejar respuesta

Please enter your comment!
Please enter your name here