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
- RxJava se vuelve a suscribir al evento tras la restauración de la actividad
- ¿Es realmente necesario RoboSpice shouldStop ()?
- Android onStop () no se llama al iniciar una nueva actividad en modo multi-ventana
- ¿Cómo ejecutar una tarea de fondo cuando la aplicación de Android está cerrada / configurada como fondo?
- Probar el estado del ciclo de vida y restaurar del proceso de aplicación de Android cuando se alcanza el estado de proceso vacío
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
- Android: ¿En qué circunstancias podría aparecer un diálogo que cause onPause ()?
- IllegalArgumentException cuando se utiliza Otto con un fragmento retenido
- Manteniendo los hilos y el estado de la conexión en la aplicación de Android usando onSaveInstanceState?
- Abra / cierre correctamente una base de datos con el patrón de diseño Singleton
- AsyncTask & runtime config change: ¿qué enfoques, con ejemplos de código conciso, respalda el equipo de Android?
- ¿Por qué se debe llamar OnCreate sólo una vez al inicio de la Actividad?
- Android: mantén agregado previamente la intención adicional cuando vayas a la actividad de los padres
- Ciclo de vida de Android que el evento disparó sólo una vez durante el ciclo de vida?
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ó.
- No se puede escribir el archivo de caché jarlist mientras se crea el proyecto android
- ¿Es posible comprobar si una notificación es visible o cancelada?