vida studio library example ciclo activity android android-activity lifecycle

studio - onstart android example



¿Presionar Atrás siempre hace que la Actividad termine()? (7)

He oído que presionar el botón Atrás hará que la Actividad actual finish() . Este es siempre el caso? Parece que sería con la forma en que saca la Actividad de la pila.

La única situación de la que no estoy tan seguro es cuando la actividad raíz en una tarea se ha presionado nuevamente. Actualmente estoy experimentando un efecto muy extraño, que se describe a continuación:

Al cargar mi aplicación, la primera Actividad es para la inicialización, y una vez que termina, llama a mi Actividad principal (una Actividad de TabActividad). Esta primera actividad de inicio tiene un conjunto de android: noHistory = "true" en el Manifiesto, por lo que presionar Atrás desde mi actividad principal no volverá a eso. Va al Lanzador. Cuando hago clic en mi aplicación en el Iniciador por segunda vez, la actividad de inicialización se carga de nuevo y carga la Actividad principal cuando termina. Casi inmediatamente después, carga una segunda instancia de mi actividad principal. Pero SOLO después de que la aplicación ya se haya ejecutado una vez y se haya salido al presionar ATRÁS de la Actividad principal. Lo hace cada vez que sigue hasta que me obligo a cerrar la aplicación o cargar una nueva versión desde el IDE.

En base a esto, sospecho que algún tipo de instancia de actividad está ahí y se está reutilizando, ya que solo ocurre en la segunda vez que ejecuto la aplicación (y salgo con BACK - usando HOME solo vuelve al último estado de la aplicación, no es gran cosa). Alguien tiene algún pensamiento?


He oído que presionar el botón Atrás hará que la Actividad actual finalice (). Este es siempre el caso?

No, no es. La mayoría de las actividades tienen este comportamiento pero no todas. Por ejemplo, podría crear un setCancelable(false) diálogo y configurarlo setCancelable(false) y no se cerrará si hace clic en el botón ATRÁS.

Además, puede personalizar el comportamiento de la actividad en el botón ATRÁS pulsado anulando onBackPressed

Se llama cuando la actividad ha detectado la pulsación del usuario de la tecla Atrás. La implementación predeterminada simplemente finaliza la actividad actual, pero puede anularla para hacer lo que quiera.

Acerca del comportamiento de su aplicación ... ¿Verificó si el iniciador de actividades finalizó después de cargar su actividad principal? Quiero decir si el método onDestroy () es llamado. Tal vez después de que se ejecute la actividad principal, permanezca allí y cuando vuelvas a hacer clic simplemente vuelves al Iniciador anterior ...

espero que esto ayude..


¿Está ejecutando sus actividades con indicadores especiales, como singleInstance o singleTop? Esas podrían estar causando las rarezas que estás viendo. La forma más fácil de rastrear qué está causando su problema es llenarlo completamente con mensajes de depuración. Por ejemplo:

  1. En su actividad de inicialización, agregue un registro al principio de onCreate para obtener el nombre de la actividad como this.toString (). Más sobre por qué quieres esta línea más tarde.
  2. Cuando inicie la actividad principal con pestañas, obtenga el nombre de la actividad de lanzamiento y un mensaje que indique que se lanzó la pestaña con pestañas.
  3. Sobrescriba las devoluciones de llamada onPause (), onStop () y onDestroy () y agregue líneas de depuración con this.toString () y también un mensaje que le indique qué devolución de llamada es.

Lo que esto hará es decirte si tienes varias instancias de la actividad de inicialización por ahí. A esto, comparando el nombre de las actividades que llaman su actividad principal con las que se crearon recientemente y las que se realizaron en onDestroy.

Si no sabe cómo depurar, use Log.d(LOG_TAG, "Your message here"); . Y luego defina una cadena LOG_TAG constante en algún lugar. Después de eso, muestre la perspectiva de LogCat en Eclispe yendo a la ventana, muestre la perspectiva (o vea, no recuerde exactamente), otro, Android, LogCat. El propósito de tener una constante LOG_TAG es que puede configurar LogCat para filtrar a esa cadena y solo mostrarle esos mensajes. Hará que sea más fácil verlos entre la masa de mensajes de registro del sistema.


La respuesta corta a la pregunta original es "no". Esto se debe principalmente a que, desafortunadamente, no todos los desarrolladores siguen las pautas a las que se hace referencia en las respuestas anteriores.

Sin embargo, las propias guías mencionan excepciones, cuando la tecla Atrás no debe llamar a finish (). la excepción más prominente es el navegador web, que tiene su propia "pila de respaldo" para cada ventana, por lo que debe tener su propio manejo personalizado de la tecla Atrás.


Lea las pautas de diseño de Actividades y Tareas en el sitio para desarrolladores de Android; explican cómo funcionan los botones Inicio y Atrás. Obviamente, si anula el comportamiento predeterminado (como se menciona en hara arriba), el botón Atrás no finalizará la actividad.

En su problema específico, compruebe su logcat. Debería poder ver allí si está devolviendo a la vida un proceso antiguo o iniciando uno nuevo. Si eso no está claro, inserte un par de declaraciones de registro en onCreate, onPause, onDestroyed, etc., para que pueda ver exactamente lo que está sucediendo con su proceso.


Puede controlar el BOTÓN POSTERIOR escribiendo el siguiente código.

public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK ) { //preventing default implementation previous to //android.os.Build.VERSION_CODES.ECLAIR return false; } return super.onKeyDown(keyCode, event); }


solo anula onbackpressed () .. en la parte posterior presiona este método obtendrás ejecutar eliminar super y hacer lo que quieras hacer.


Si no hay fragmentos en la pila trasera y un desarrollador no ha anulado onBackPressed, la actividad finalizará cuando se presione el botón Atrás.

Aquí está el código fuente para Android 4.4.2 Activity.onBackPressed ():

public void onBackPressed() { if (!mFragments.popBackStackImmediate()) { finish(); } }