Problema al ordenar la pila de actividades al iniciar la aplicación desde el instalador de aplicaciones para Android y desde la pantalla de inicio

Para fines de prueba solamente, estoy permitiendo que mi aplicación APK se descargue e instale a través de una URL. Una vez descargado en el teléfono, se puede iniciar con el instalador de aplicaciones de Android, que le da al usuario una opción para instalarlo en su dispositivo y luego ejecutarlo.

Considere la posibilidad de descargar y ejecutar la aplicación de la manera descrita anteriormente. La actividad principal / iniciadora en mi aplicación es una página de inicio de sesión ( Activity A ). Una vez que el usuario es autenticado, son llevados al área principal de la aplicación, por ejemplo Activity B Así que ahora la pila de actividad actual de esta tarea es A > B

A continuación, presione el botón de inicio en el teléfono y me llevan a la pantalla de inicio de Android. Vuelvo a lanzar mi aplicación a través del icono en el menú, y me llevan a la Activity A , en lugar de la Activity B Ya sea la pila de actividades es ahora A > B > A , o hay ahora dos tareas independientes con pilas de actividad A > B y A respectivamente. Lo que quiero es que me devuelvan a la Activity B cuando vuelva a iniciar la aplicación. Presionando hacia atrás mientras está en este estado me llevará de nuevo a la Activity B

Este comportamiento no deseado sólo ocurre si primero abra la aplicación a través del instalador, y no si abro la aplicación a través de la pantalla de inicio / menú.

Miré cómo se están iniciando las actividades por cada mecanismo. Cuando usamos el instalador de aplicaciones, vemos los siguientes registros:

 INFO/ActivityManager(XXXX): Starting activity: Intent { dat=file:///mnt/sdcard/download/[my app].apk cmp=com.android.packageinstaller/.InstallAppProgress (has extras) } INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=[my package]/[Activity A] } 

Vía el lanzador / pantalla de inicio:

 INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=[my package]/[Activity A] } 

Cuando se inicia con el instalador vemos que está usando el indicador 0x10000000 , pero cuando se inicia con el lanzador vemos que está usando 0x10200000 . También está usando una categoría de intención.

De los documentos que vemos las banderas son:

 public static final int FLAG_ACTIVITY_NEW_TASK Constant Value: 268435456 (0x10000000) public static final int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED Constant Value: 2097152 (0x00200000) 

El flag FLAG_ACTIVITY_RESET_TASK_IF_NEEDED (que se está utilizando cuando la aplicación se inicia desde el lanzador) parece impedir normalmente que se cree una nueva tarea si ya existe y restaurará la última actividad utilizada. Este es el comportamiento deseado. ¿Por qué no funciona en esta situación? ¿Hay algo que pueda hacer para asegurarme de que mi aplicación siempre me devuelva a la última actividad independientemente de si se inició a través del instalador / lanzador de aplicaciones?

Si utilizo singleTask , siempre volveré a la actividad principal ( Activity A ) cada vez que ejecute la aplicación (lo cual tampoco es deseable).

Aquí hay una pregunta que encontré donde alguien está experimentando un problema similar (que no tiene respuesta aceptada): App pierde su capacidad de recordar su pila cuando se inicia desde otra aplicación

EDIT: Comprobar la bandera FLAG_ACTIVITY_BROUGHT_TO_FRONT en onCreate() de nuestra actividad de lanzador (y luego terminar si está configurado) parece arreglar el síntoma principal, pero claramente el problema subyacente sigue ahí. ¿Hay una solución más completa?

EDIT2: El mismo resultado se produce cuando descarga / ejecuta la aplicación desde Android Market, por lo que algunos de los detalles anteriores pueden no ser relevantes.

3 Solutions collect form web for “Problema al ordenar la pila de actividades al iniciar la aplicación desde el instalador de aplicaciones para Android y desde la pantalla de inicio”

Añadió la respuesta que antonyt proporcionó:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { // Activity was brought to front and not created, // Thus finishing this will get us to the last viewed activity finish(); return; } // Regular activity creation code... } 

El problema subyacente que creo es que los Intent utilizados son diferentes entre el lanzador y el instalador. En la medida en que usted está recibiendo diferentes indicadores de intención que va a obtener comportamiento de lanzamiento diferente. Usted puede muck con los modos de lanzamiento y usted puede ser capaz de obtener un resultado coherente, pero fundamentalmente los diferentes intents producirá resultados diferentes.

Su solución (o algo como esto ) es probablemente su mejor apuesta.

Es probable que su problema esté enraizado en el hecho de que el instalador de aplicaciones no utiliza la categoría LANZADOR, al igual que el lanzador.

Este error se ha documentado en otra parte:

La aplicación comienza siempre nueva de la actividad de la raíz en lugar de reanudar el estado de fondo (Bug conocido)

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.