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 Activity
con la acción android.intent.action.MAIN
y 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
Activity
independientemente 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 Activity
no 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 deActivity
nuevo 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
Activity
o, siTask
está abierto un inicio anterior, lo pone al frente. Dicho de otra manera: si en cualquier etapa de su navegación crea una nuevaTask
yfinish
la 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
Task
está 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_TASK
crea 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"
Activity
en mi aplicación usando la bandera anterior. Después de todo, si hubiera "reiniciado" mi aplicación yActivity
todaví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:
A
lanzadoB
conFLAG_ACTIVITY_CLEAR_TOP
,A
acabados.B
desea reiniciar un servicio, de modo que envía al usuarioA
que tiene la lógica de reinicio del servicio y la interfaz de usuario (sin banderas).A
se iniciaB
con FLAG_ACTIVITY_CLEAR_TOP,A
termina.En esta etapa
FLAG_ACTIVITY_CLEAR_TOP
, se reinicia el segundo indicadorB
que se encuentra en la pila de tareas. Supongo que esto debe destruir elTask
y 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_TOP
Si reinicia el único restanteActivity
, también recreará un nuevoTask
fuente
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 ,
launchMode
está configurado ensingleInstance
(android:launchMode="singleInstance"
). Eliminar ellaunchMode
atributo solucionó mi problema.fuente
launchMode
valores: 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ó.
onSaveInstanceState
onSaveInstanceState
Ejemplo: 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
onRestoreInstanceState
mé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
onSaveInstanceState
hará. 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