vida una tipos studio regresar que pila pantallas navegacion flag_activity_new_task entre desde ciclo cerrar boton aplicacion anterior activity actividades abrir android android-activity android-intent task flags

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



regresar a un activity anterior android (3)

El problema subyacente que creo es que los Intent utilizados son diferentes entre el iniciador y el instalador. En la medida en que obtenga diferentes indicadores de intención, obtendrá un comportamiento de inicio diferente. Puede ensuciar con los modos de lanzamiento y es posible que pueda obtener un resultado consistente, pero fundamentalmente esas diferentes Intenciones producirán resultados diferentes.

Tu solución (o algo como this ) es probablemente tu mejor opción.

Solo para fines de prueba, 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 la aplicación Android, que le da 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 / iniciador en mi aplicación es una página de inicio de sesión ( Activity A ). Una vez que el usuario está autenticado, se llevan al área principal de la aplicación, por ejemplo, la Activity B Entonces, la pila de actividades actual de esta tarea es A > B

Luego presiono el botón de inicio en el teléfono y me llevan a la pantalla de inicio de Android. Reinicio mi aplicación a través del ícono en el menú, y me llevan a la Activity A , en lugar de a la Activity B O la pila de actividades ahora es A > B > A , o ahora hay dos tareas separadas con pilas de actividades A > B y A respectivamente. Lo que quiero es regresar a la Activity B cuando reinicie la aplicación. Presionando hacia atrás mientras estoy en este estado me llevará de vuelta a la Activity 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 de inicio / menú.

Miré 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] }

a través del iniciador / 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 el indicador 0x10000000 , pero cuando se inicia con el iniciador vemos que está usando 0x10200000 . También está usando una categoría de intención.

De los docs 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 indicador FLAG_ACTIVITY_RESET_TASK_IF_NEEDED (que se está utilizando cuando se inicia la aplicación desde el iniciador) parece normalmente evitar que se cree una nueva tarea si ya existe, y restaurará la última actividad utilizada. Este es el comportamiento deseado. ¿Por qué no está funcionando 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 / iniciador de la aplicación?

Si uso singleTask siempre me llevará de vuelta a la actividad principal ( Activity A ) siempre que ejecute la aplicación (que tampoco es deseable).

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

EDITAR: Verificando la bandera FLAG_ACTIVITY_BROUGHT_TO_FRONT en onCreate() de nuestra actividad de onCreate() y luego terminando si está configurada) parece arreglar el síntoma principal, pero claramente el problema subyacente todavía está allí. ¿Hay una solución más completa?

EDIT2: el mismo resultado ocurre cuando descargas / ejecutas la aplicación desde Android Market, por lo que algunos de los detalles anteriores pueden no ser relevantes.



Se agregó 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... }