Problema de orden de la pila de actividad al iniciar la aplicación desde el instalador de la aplicación de Android y desde la pantalla de inicio

Solo para fines de prueba, estoy permitiendo que la 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 la aplicación de Android, que ofrece al usuario la opción de instalarlo en su dispositivo y luego ejecutarlo.

Considere si descargamos y ejecutamos la aplicación de la manera descrita anteriormente. La actividad principal / del iniciador en mi aplicación es una página de inicio de sesión Activity A). Una vez que el usuario se autentica, se lo lleva al área principal de la aplicación, p. @Activity B. Entonces, la pila de actividad actual de esta tarea esA > B.

Luego presiono el botón de inicio en el teléfono y me lleva a la pantalla de inicio de Android. Vuelvo a iniciar mi aplicación a través del icono en el menú, y me llevan aActivity A, en lugar deActivity B. O la pila de actividades ahora esA > B > A, o ahora hay dos tareas separadas con pilas de actividadA > B yA respectivamente. Lo que quiero es que me devuelvan aActivity B cuando relancé la aplicación. Al presionar hacia atrás mientras estoy en este estado, volveré aActivity B.

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

Investigué cómo las actividades están siendo iniciadas por cada mecanismo. Cuando usamos el instalador de la aplicación, 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] }

via 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 comenzamos con el instalador, vemos que está usando la bandera0x10000000, pero cuando comenzamos con el lanzador vemos que está usando0x10200000. También está utilizando una categoría de intención.

Desde el docs vemos que 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)

La banderaFLAG_ACTIVITY_RESET_TASK_IF_NEEDED (que se usa cuando la aplicación se inicia desde el iniciador) parece evitar 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 devolverá a la última Actividad, independientemente de si se inició a través del instalador / iniciador de aplicaciones?

Si usosingleTask siempre me llevará de vuelta a la actividad principal Activity A) cada vez que ejecuto la aplicación (que 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: Comprobando la banderaFLAG_ACTIVITY_BROUGHT_TO_FRONT inonCreate() de nuestra actividad de iniciador (y luego terminar si está configurado) parece corregir 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.

Respuestas a la pregunta(3)

Su respuesta a la pregunta