Espero que alguien pueda ayudarme a descubrir, si no una solución, al menos una explicación de un comportamiento.
El problema:
En algunos dispositivos, presionar el ícono del iniciador hace que se reanude la tarea actual, en otros resulta en que se dispare la intención de inicio inicial (reiniciando efectivamente la aplicación). ¿Por qué pasó esto?
El detalle:
Cuando presiona el "Icono del iniciador", la aplicación se inicia normalmente: es decir, supongo que se inicia una intención con el nombre de su primero Activitycon la acción android.intent.action.MAINy la categoría android.intent.category.LAUNCHER. Sin embargo, este no siempre puede ser el caso:
En la mayoría de los dispositivos, si presiona el ícono del iniciador después de que la aplicación ya se esté ejecutando, la Actividad actualmente en ejecución en ese proceso se reanudará ( NO la inicial Activity). Se reanuda de la misma manera que si lo hubiera seleccionado en "Tareas recientes" en el menú del sistema operativo. Este es el comportamiento que quiero en todos los dispositivos.
Sin embargo, en otros dispositivos seleccionados se produce un comportamiento diferente:
En el Motorola Xoom, cuando presiona el ícono del iniciador, la aplicación siempre iniciará el inicio inicial
Activityindependientemente de lo que se esté ejecutando actualmente. Supongo que los íconos del iniciador siempre inician la intención "LANZADOR".En el Samsung Tab 2, cuando presiona el ícono del iniciador, si acaba de instalar la aplicación, siempre iniciará la inicial
Activity(igual que el Xoom); sin embargo, después de reiniciar el dispositivo después de la instalación, el ícono del iniciador en su lugar reanudar la aplicación ¿Supongo que estos dispositivos agregan "aplicaciones instaladas" en una tabla de búsqueda en el inicio del dispositivo que permite que los íconos del iniciador reanuden correctamente las tareas en ejecución?
He leído muchas respuesta que el sonido similar a mi problema, sino simplemente añadiendo android:alwaysRetainTaskState="true"o el uso de launchMode="singleTop"la Activityno son la respuesta.
Editar:
Después del lanzamiento más reciente de esta aplicación, encontramos que este comportamiento ha comenzado a ocurrir en todos los dispositivos después del primer reinicio. Lo que me parece una locura, pero mirando a través del proceso de reinicio, en realidad no puedo encontrar lo que está mal.
fuente

finish()a ellos en los casos en que comienza el primero deActivitynuevo en lugar de reanudarlos.Respuestas:
El comportamiento que está experimentando es causado por un problema que existe en algunos lanzadores de Android desde la API 1. Puede encontrar detalles sobre el error y las posibles soluciones aquí: https://code.google.com/p/android/issues/ detalle? id = 2373 .
Es un problema relativamente común en los dispositivos Samsung, así como en otros fabricantes que usan un iniciador / máscara personalizado. No he visto que el problema ocurra en un iniciador de Android.
Básicamente, la aplicación no se está reiniciando por completo, pero su actividad de inicio se está iniciando y agregando a la parte superior de la pila de actividades cuando el iniciador reanuda la aplicación. Puede confirmar que este es el caso haciendo clic en el botón Atrás cuando reanude la aplicación y se muestre la Actividad de inicio. Luego debería ser llevado a la Actividad que esperaba que se mostrara cuando reanudó la aplicación.
La solución que elegí implementar para resolver este problema es verificar la categoría Intent.CATEGORY_LAUNCHER y la acción Intent.ACTION_MAIN en el intento que inicia la Actividad inicial. Si esos dos indicadores están presentes y la Actividad no está en la raíz de la tarea (lo que significa que la aplicación ya se estaba ejecutando), entonces llamo a terminar () en la Actividad inicial. Es posible que esa solución exacta no funcione para usted, pero algo similar debería funcionar.
Esto es lo que hago en onCreate () de la Actividad inicial / de lanzamiento:
fuente
Esta pregunta aún es relevante en 2016. Hoy, un probador de control de calidad informó que una aplicación mía se reiniciaba en lugar de reanudarse desde el iniciador de stock en Android M.
En realidad, el sistema estaba agregando la actividad iniciada a la pila de tareas actual , pero al usuario le pareció que había ocurrido un reinicio y que había perdido su trabajo. La secuencia fue:
Nota: este problema no se manifiesta para los APK de depuración implementados a través de ADB, solo en los APK descargados de Play Store o de carga lateral. En los últimos casos, la intención de lanzamiento del paso 5 contenía la bandera
Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT, pero no en los casos de depuración. El problema desaparece una vez que la aplicación se ha iniciado en frío desde el iniciador. Mi sospecha es que la Tarea se siembra con un Intento malformado (más exactamente, no estándar) que evita el comportamiento de inicio correcto hasta que la tarea se borre por completo.Probé varios modos de inicio de actividad , pero esa configuración se desvía demasiado del comportamiento estándar que el usuario esperaría: reanudar la tarea en la actividad B. Consulte la siguiente definición de comportamiento esperado en la guía Tareas y Pila de documentos , en la parte inferior de la página bajo 'Inicio de una tarea':
Encontré que esta respuesta era relevante e inserté lo siguiente en el método 'onCreate' de mi actividad raíz (A) para que se reanude adecuadamente cuando el usuario abre la aplicación.
ACTUALIZACIÓN: alejó esta solución de analizar indicadores de intención a consultar si la actividad está directamente en la raíz de la tarea. Los indicadores de intención son difíciles de predecir y probar con todas las diferentes formas de abrir una actividad PRINCIPAL (Iniciar desde casa, iniciar desde el botón 'arriba', iniciar desde Play Store, etc.)
fuente
¡Ajá! (tldr; Vea las declaraciones en negrita en la parte inferior)
He encontrado el problema ... creo.
Entonces, comenzaré con una suposición. Cuando presiona el iniciador , se inicia el valor predeterminado
Activityo, siTaskestá abierto un inicio anterior, lo pone al frente. Dicho de otra manera: si en cualquier etapa de su navegación crea una nuevaTaskyfinishla anterior, el iniciador ya no reanudará su aplicación.Si esa suposición es cierta, estoy bastante seguro de que debería ser un error, dado que cada uno
Taskestá en el mismo proceso y es tan válido como candidato para el currículum vitae.Entonces, mi problema se solucionó eliminando estas banderas de un par de
Intents:Si bien es bastante obvio que
FLAG_ACTIVITY_NEW_TASKcrea una nuevaTask, no me gustó que la suposición anterior estuviera vigente. Lo consideré un culpable y lo eliminé para probarlo y todavía tenía un problema, así que lo descarté. Sin embargo, todavía tenía las siguientes condiciones:Mi pantalla de inicio estaba iniciando el "principal"
Activityen mi aplicación usando la bandera anterior. Después de todo, si hubiera "reiniciado" mi aplicación yActivitytodavía estuviera ejecutándose, preferiría preservar su información de estado.Notarás en la documentación que no hace mención de comenzar un nuevo
Task:Entonces, tuve la situación como se describe a continuación:
AlanzadoBconFLAG_ACTIVITY_CLEAR_TOP,Aacabados.Bdesea reiniciar un servicio, de modo que envía al usuarioAque tiene la lógica de reinicio del servicio y la interfaz de usuario (sin banderas).Ase iniciaBcon FLAG_ACTIVITY_CLEAR_TOP,Atermina.En esta etapa
FLAG_ACTIVITY_CLEAR_TOP, se reinicia el segundo indicadorBque se encuentra en la pila de tareas. Supongo que esto debe destruir elTasky comenzar uno nuevo, causando mi problema, que es una situación muy difícil de detectar si me preguntas.Entonces, si todas mis suposiciones son correctas:
Launcherúnico reanuda la tarea creada inicialmenteFLAG_ACTIVITY_CLEAR_TOPSi reinicia el único restanteActivity, también recreará un nuevoTaskfuente
Tuve el mismo problema en los dispositivos Samsung. Después de buscar mucho, ninguna de estas respuestas funcionó para mí. Encontré eso en el archivo AndroidManifest.xml ,
launchModeestá configurado ensingleInstance(android:launchMode="singleInstance"). Eliminar ellaunchModeatributo solucionó mi problema.fuente
launchModevalores: inthecheesefactory.com/blog/…En mi Cat s60, había habilitado "No mantener actividades" en las opciones de desarrollador, deshabilitar esto nuevamente me permitió cambiar de aplicación sin perder el estado de las aplicaciones ...
fuente
Esta solución funcionó para mí:
crédito: necesito minimizar la aplicación de Android al hacer clic en el botón Atrás
Es posible que no funcione en todos los dispositivos, pero crea correctamente el comportamiento del botón de inicio cuando se presiona el botón Atrás, lo que detiene la actividad en lugar de finalizarla.
fuente
Tuve el mismo problema, la causa fue:
(Código de Kotlin, en MainActivity)
Entonces, cuando navego a mi MainActivity desde mi LoginActivity, uso esto:
Al usar estos indicadores, no tengo que tener un onBackPressed () en mi MainActivity, saldrá de la aplicación de forma natural al hacer clic de nuevo. Y al presionar el botón Inicio y volver a la aplicación, no se reinicia.
fuente
Solución para las personas que no tienen idea de programar y experimentar este problema en su teléfono Android. Esto sucede principalmente debido a la actualización de la versión de Android (solo mi suposición). Después de la actualización, todas sus aplicaciones se optimizan para usar menos batería. Pero, esto a su vez ralentiza su dispositivo.
Cómo resolver
Vaya a configuración >> Aplicaciones >> configuración de aplicaciones (busque el signo de configuración en cualquier lugar de la pantalla, es diferente en diferentes dispositivos) >> optimización de la batería (u opti similar [ingrese la descripción de la imagen aquí] [1] encendido) >> mueva todo aplicaciones en estado 'no optimizado' (tienen que hacer 1 por 1 manualmente, se puede permitir / no permitir en algunos teléfonos). Su aplicación de inicio debe estar 'no optimizada' (lanzador Zen UI en mi caso, supongo que es el culpable, podría intentar optimizar / No optimizar y reiniciar diferentes aplicaciones si tiene tiempo). Ahora reinicia tu teléfono.(no es necesario restablecer los datos / modo seguro ni ningún problema)
Prueba la multitarea ahora. :) Al presionar el ícono del iniciador ahora se debe reanudar la tarea actual. :) Su dispositivo se convertirá No se preocupe por la batería, se agotará de todos modos.
fuente
No tiene precio para sus usuarios. El currículum perfecto incluso después de estar sentado semanas en la lista de aplicaciones utilizadas recientemente.
Parece un currículum para el usuario, pero en realidad es un comienzo completo.
Antecedentes: la memoria utilizada por las aplicaciones que se encuentran en la actividad principal que no han iniciado una tarea es fácil de recuperar. El sistema operativo simplemente puede reiniciar la aplicación con el paquete original pasado a onCreate. Sin embargo, puede agregar al paquete original para que cuando el sistema operativo reinicie su aplicación, pueda restaurar el estado de la instancia y nadie sea más sabio sobre si la aplicación se reinició o se reanudó. Tomemos, por ejemplo, el programa de mapas clásico. El usuario se mueve a una posición en el mapa y luego presiona la tecla de inicio. Dos semanas después, esta aplicación de mapeo todavía está en la lista de aplicaciones recientes junto con Facebook, Pandora y Candy Crush. El sistema operativo no solo guarda el nombre de la aplicación para las aplicaciones utilizadas recientemente, sino que también guarda el paquete original utilizado para iniciar la aplicación. Sin embargo, el programador ha codificado el método para que el paquete original ahora contenga todos los materiales e información necesarios para construir la aplicación para que parezca que se reanudó.
onSaveInstanceStateonSaveInstanceStateEjemplo: guarde la posición actual de la cámara en onSaveInstanceState solo en caso de que la aplicación esté descargada y deba reiniciarse semanas después de la lista de aplicaciones recientes.
Nota: también puede usar el
onRestoreInstanceStatemétodo, pero me resulta más fácil restaurar la instancia enonCreate.Esto es más que probable lo que está sucediendo en su aplicación. En algunos dispositivos, su aplicación se descarga a la memoria libre. Sí, hay algunas banderas que ayudan, pero las banderas no captarán todos los matices de su aplicación y las banderas no lo mantendrán vivo durante semanas como lo
onSaveInstanceStatehará. Tienes que codificar el currículum perfecto dos semanas después. No será una tarea fácil para la aplicación compleja, pero estamos detrás de usted y estamos aquí para ayudarlo.Buena suerte
fuente