Me he encontrado con un error en mi aplicación cuando se inicia con el botón "Abrir" en la aplicación Google Play Store (anteriormente llamada Android Market). Parece que lanzarlo desde Play Store utiliza una forma diferente Intent
de hacerlo desde el menú de iconos de la aplicación del teléfono. Esto lleva a que se inicien varias copias de la misma actividad, que están en conflicto entre sí.
Por ejemplo, si mi aplicación consta de Actividades ABC, entonces este problema puede generar una pila de ABCA.
Intenté usar android:launchMode="singleTask"
en todas las actividades para solucionar este problema, pero tiene el efecto secundario no deseado de borrar la pila de actividades a la raíz cada vez que presiono el botón INICIO.
El comportamiento esperado es: ABC -> INICIO -> Y cuando se restaura la aplicación, necesito: ABC -> INICIO -> ABC
¿Existe una buena manera de evitar que se inicien varias actividades del mismo tipo, sin restablecer la actividad raíz cuando se usa el botón INICIO?
fuente
Respuestas:
Agregue esto a onCreate y debería estar listo para comenzar:
fuente
finish()
, el usuario verá la actividad que estaba debajo. Por eso, puede asumir con seguridad que la instancia existente de la aplicación pasará a primer plano. Si ese no fuera el caso, tendría varias instancias de la aplicación en tareas separadas y la actividad que se está creando sería la raíz de su tarea.Solo voy a explicar por qué falla y cómo reproducir este error de manera programática para que pueda incorporar esto en su conjunto de pruebas:
Cuando inicia una aplicación a través de Eclipse o Market App, se inicia con indicadores de intención: FLAG_ACTIVITY_NEW_TASK.
Cuando se lanza a través del lanzador (inicio), usa banderas: FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_BROUGHT_TO_FRONT | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED, y usa la acción " MAIN " y la categoría " LAUNCHER ".
Si desea reproducir esto en un caso de prueba, siga estos pasos:
Luego haga lo que sea necesario para llegar a la otra actividad. Para mis propósitos, acabo de colocar un botón que inicia otra actividad. Luego, regrese al lanzador (inicio) con:
Y simule lanzarlo a través del lanzador con esto:
Si no ha incorporado la solución alternativa isTaskRoot (), esto reproducirá el problema. Usamos esto en nuestras pruebas automáticas para asegurarnos de que este error nunca vuelva a ocurrir.
¡Espero que esto ayude!
fuente
¿Has probado el singleTop? modo de lanzamiento ?
Aquí está parte de la descripción de http://developer.android.com/guide/topics/manifest/activity-element.html :
fuente
¿Quizás sea este problema ? ¿O alguna otra forma del mismo error?
fuente
Creo que la respuesta aceptada ( Duane Homick ) tiene casos sin :
Tienes diferentes extras (y duplicados de aplicaciones como resultado):
Aquí hay una solución (SDK_INT> = 11 para notificaciones) que creo que maneja estos casos y las notificaciones de la barra de estado también.
Manifiesto :
Actividad del lanzador :
Servicio :
Notificacion :
fuente
Me doy cuenta de que la pregunta no tiene nada que ver con Xamarin Android pero quería publicar algo ya que no lo vi en ningún otro lado.
Para solucionar esto en Xamarin Android, usé el código de @DuaneHomick y lo agregué a
MainActivity.OnCreate()
. La diferencia con Xamarin es que debe ir trasXamarin.Forms.Forms.Init(this, bundle);
yLoadApplication(new App());
. Entonces miOnCreate()
se vería así:* Editar: Desde Android 6.0, la solución anterior no es suficiente para ciertas situaciones. He ahora también fijar
LaunchMode
aSingleTask
, que parece haber hecho las cosas funcionan correctamente una vez más. Desafortunadamente, no estoy seguro de qué efectos podría tener esto en otras cosas.fuente
Tuve el mismo problema y lo solucioné usando la siguiente solución.
En su actividad principal, agregue este código en la parte superior del
onCreate
método:no olvide agregar este permiso en su manifiesto.
Espero que te ayude.
fuente
Tuve este problema tambien
android:configChanges="mcc|mnc"
, si tiene conexión a celular, consulte http://developer.android.com/guide/topics/manifest/activity-element.html#config para saber qué configuración hay al arrancar el sistema o presionar para abrir o lo que sea.fuente
Pruebe esta solución:
cree una
Application
clase y defina allí:Luego, en su primera actividad (Lanzador)
onCreate
antes desetContentView(...)
agregar esto:PD
Controller
es miApplication
clase.fuente
IS_APP_RUNNING
serátrue
y su aplicación se cerrará inmediatamente. No es algo que el usuario pueda encontrar divertido.intente usar el modo de inicio de SingleInstance con afinidad establecida en allowtaskreparenting. Esto siempre creará la actividad en una nueva tarea, pero también permitirá su reparenting. Comprobar dis: atributo de afinidad
fuente
Encontré una manera de evitar comenzar las mismas actividades, esto funciona muy bien para mí
fuente