Tener una instancia de actividad

Tengo un problema con la navegación de actividades y la pila de atrás y esperaba que usted podría aclarar para mí.

El problema

Actividad de la raíz >>> SecondActivity >> HomeButton

Esto luego me lleva a la página principal y desde allí selecciono …

Gmail >> Mensaje >> Abrir adjunto en mi aplicación >> ImportActivity >> RootActivity

El resultado es una nueva tarea que se está iniciando y otra instancia de mi aplicación que se está utilizando. Esto es inaceptable ya que no quiero que se ejecuten dos tareas separadas. Sólo quiero una.

El resultado deseado

Lo que quiero que suceda es cuando el usuario abre el archivo adjunto e ImportActivity termina lo que está haciendo (tiene android:noHistory establecido en true) y llama a startActivity(intent) , RootActivity se inicia, pero manteniendo sólo una instancia y el resto de las actividades Encima de él en la tarea original (en este caso SecondActivity ) se eliminan.

La razón que quiero esto es si el usuario navega fuera de mi aplicación después de importar el archivo y luego toca el icono de la aplicación que carga la primera tarea con su pila de nuevo y tengo dos tareas en ejecución en el que el usuario puede estar en dos partes diferentes de Mi solicitud a la vez.

Lo que he intentado

He jugado alrededor con el modo de lanzamiento, pero ninguno de ellos realmente me dan la funcionalidad que necesito.

Modos de lanzamiento que he probado ..

Android: launchMode = "singleTask" – esto acaba de comenzar la actividad de la raíz otra vez cada vez que fue lanzado. Incluso si el usuario presionó el botón de inicio dentro de mi aplicación y tocó el icono de la aplicación la pila de atrás fue destruido.

Android: launchMode = "singleInstance = no permite que otras actividades se ejecuten en la tarea.

También al llamar a la intención de iniciar RootActivity He utilizado lo siguiente sin éxito.

 Intent i = new Intent(ImportActivity.this,TrackingActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); 

¿Es posible hacer lo que quiero?

Gracias por adelantado

Tu dices

 Gmail >> Message >> Open attachment in my application >> ImportActivity >> RootActivity 

Pero eso puede no estar bien. En esta circunstancia, gmail emitirá un Intent dirigido a ImportActivity en su aplicación. ImportActivity se ejecutará. Sin embargo, mi lectura de https://developer.android.com/guide/components/tasks-and-back-stack.html sugiere que ImportActivity se ejecutará como parte de la misma tarea que gmail y se colocará encima de la parte posterior Pila para la tarea de gmail, a menos que tome medidas especiales en el manifiesto para evitar que o gmail invoca específicamente como una tarea independiente. Cuando termine ImportActivity , no debería llamar a startActivity(intentForRootActivity) sino que debe llamar a finish() para que se destruya y aparecerá la actividad de gmail que se encuentra debajo de ella en la pila de respaldo.

Si ImportActivity llamó a startActivity(intentForRootActivity) entonces RootActivity iría a la parte superior de la tarea de gmail y aparecería en la pila posterior de gmail. Al tocar en home y luego en el icono del lanzador para gmail, volvería a aparecer RootActivity , ocultando gmail debajo.

Creo que necesita android:launchMode="standard" en la declaración de manifiesto de ImportActivity .

La tarea que representa la instancia autónoma más antigua de tu aplicación no se modificará. Si alguien toca el ícono del lanzador para tu aplicación, se restaurará el estado anterior de la aplicación, sin afectar por lo que suceda en la tarea de gmail.

El documento http://developer.android.com/guide/components/processes-and-threads.html es bastante vago acerca de cómo las actividades se correlacionan con los procesos aquí (lo que hace que David Wasser comente mi versión anterior de esta respuesta), pero parece Que las Actividades de gmail se ejecutarán en un proceso linux con una identificación de usuario linux y la ImportActivity se ejecutará en otro proceso linux con otra id de usuario. Sin embargo, todos ellos pueden formar parte de una tarea con una pila trasera.

ImportActivity ejecutará, como parte de la tarea de gmail, la misma ID de usuario de Linux efectiva que si la hubiera ejecutado como parte de su aplicación independiente y diferente del ID de usuario de Linux con el que se ejecuta Gmail. Esto suena improbable y complicado, pero parece estar implícito en https://developer.android.com/guide/components/fundamentals.html . Eso tiene sentido; Si ImportActivity necesita obtener, digamos, las preferencias de usuario almacenadas para su aplicación, necesita leer el archivo de preferencias como si fuera el usuario definido para su aplicación, no el usuario definido para gmail.

No he intentado ejecutar nada de esto. ¡Si tengo el asidero completamente del extremo equivocado del palo, estoy seguro de que alguien nos lo dirá pronto!

Usted no debe necesitar ningún launchMode especial para hacer esto. Si la actividad de importación inicia la actividad raíz con Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP esto debe hacer lo que quiera. Supongo que tienes un problema con taskAffinity . Prueba esto:

En su manifiesto, en la declaración para importActivity, agregue esto:

 android:taskAffinity="" 

Si esto no funciona, por favor, publique su manifiesto para que podamos verlo.

Realmente no estoy seguro de si lo conseguí, pero si quieres ir a tu actividad "root" sin perder la pila de aplicaciones, sería Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP directo en banderas en su intención, y sin ninguna configuración adicional en Manifest … y si necesita separar la tarea para crear una nueva pila nueva completa que se puede utilizar Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP como describió.

  • La actividad no llamó a terminar? (API 23)
  • ¿Android pasa información persistente en paquetes o usa un patrón singleton?
  • ¿Cuándo usar getSharedPreferences vs savedInstanceState?
  • Nexus 5 va a modo de espera hace ciclo de vida de actividad buggy
  • Cómo iniciar una nueva actividad al hacer clic en el botón
  • Aplicación eliminada mientras se realiza onPause (). ¿Algún consejo sobre cómo manejar tal caso?
  • ¿Cómo usar onResume ()?
  • onDestroy () se llama cuando se presiona el botón de retroceso
  • Flag Activity Clear Top destruye la actividad objetivo y que la crea
  • Cuándo guardar los datos en la base de datos, onPause () o onStop ()?
  • ¿Puede Android matar a mi aplicación mientras está en medio de una ejecución de bucle?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.