android - programacion - Tener una instancia de actividad
manual de programacion android pdf (3)
No debería necesitar ningún launchMode
especial para hacer esto. Si su 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 debería hacer lo que quieras. Supongo que tienes un problema con la taskAffinity
. Prueba esto:
En su manifiesto, en la declaración para la actividad de importación, agregue esto:
android:taskAffinity=""
Si esto no funciona, publique su manifiesto para que podamos verlo.
Tengo un problema con la navegación de actividad y la pila de respaldo, y esperaba que pudieras solucionarlo por mí.
El problema
Actividad de root >>> SecondActivity >> HomeButton
Esto me lleva a la página de inicio y de allí selecciono ...
Gmail >> Mensaje >> Abrir archivo adjunto en mi aplicación >> ImportActivity >> RootActivity
El resultado es una nueva tarea que se inicia y otra instancia de mi aplicación en uso. Esto es inaceptable ya que no quiero ejecutar dos tareas por separado, solo 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 verdadero) y llama a startActivity(intent)
, se inicia RootActivity
, pero manteniendo solo una instancia y el resto de las actividades en la parte superior de la tarea original (en este caso SecondActivity
) se eliminan.
La razón por la 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 carga la primera tarea con su back stack y tengo dos tareas ejecutándose en las que el usuario puede estar en dos partes diferentes de mi aplicación a la vez.
Lo que he intentado
He jugado con el modo de lanzamiento pero ninguno de ellos realmente me da la funcionalidad que necesito.
Modos de lanzamiento que he intentado ...
android: launchMode = "singleTask" - esto acaba de iniciar la actividad de root nuevamente cada vez que se lanzó. Incluso si el usuario presionó el botón de inicio dentro de mi aplicación y tocó el ícono de la aplicación, se destruyó la pila de respaldo.
android: launchMode = "singleInstance = no permite que se ejecuten otras actividades en la tarea.
Además, al llamar al intento de iniciar RootActivity
, he utilizado lo siguiente en vano.
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
Realmente no estoy seguro si lo obtuve, pero si quieres ir a tu actividad "raíz" sin perder pila de aplicaciones adicionales, sería Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP
Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP
directa en las banderas en su intent
, y sin configuraciones adicionales en Manifest
... y si necesita separar la tarea para crear una nueva pila completa que usted puede usar Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP
Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP
como lo describió.
Tu dices
Gmail >> Message >> Open attachment in my application >> ImportActivity >> RootActivity
pero eso puede no ser correcto. 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á en la parte superior de la parte posterior. apilar para la tarea de gmail, a menos que tome medidas especiales en el manifiesto para evitar eso o gmail lo invoque específicamente como una tarea separada. Cuando ImportActivity
finaliza, no debe llamar a startActivity(intentForRootActivity)
sino que debe llamar a finish()
para que se destruya y aparezca la actividad de gmail que se encuentra debajo de él en la pila posterior.
Si ImportActivity
llamó a startActivity(intentForRootActivity)
entonces RootActivity
simplemente iría a la parte superior de la tarea de gmail y aparecería en la pila de gmail. Tocando la pantalla de home
y luego el ícono del RootActivity
para Gmail verás que reaparece RootActivity
, ocultando gmail debajo.
Creo que necesitas android:launchMode="standard"
en la declaración de manifiesto de ImportActivity
.
La tarea que representa la instancia más antigua e independiente de su aplicación no se modificará. Si alguien toca el ícono del iniciador de tu aplicación, se restaurará el estado anterior de tu aplicación, sin afectar lo que ocurra en la tarea de Gmail.
El documento http://developer.android.com/guide/components/processes-and-threads.html es bastante impreciso sobre cómo las actividades se asignan aquí a los procesos (haciendo que David Wasser haga un comentario sobre mi versión anterior de esta respuesta) pero parece que las actividades de gmail se ejecutarán en un proceso de Linux con una identificación de usuario de Linux y la actividad de ImportActivity
se ejecutará en otro proceso de Linux con otra identificación de usuario. Sin embargo, todos pueden formar parte de una tarea con una sola pila.
ImportActivity
se ejecutará, como parte de la tarea de gmail, con la misma identificación de usuario efectiva de Linux que si se hubiera ejecutado como parte de su aplicación independiente, y diferente de la ID de usuario de Linux con la que se ejecuta Gmail. Esto parece poco probable y complicado, pero parece estar implícito en https://developer.android.com/guide/components/fundamentals.html . Eso tiene sentido; si ImportActivity
necesita obtener, por ejemplo, las preferencias del usuario almacenadas para su aplicación, debe 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 agarro completamente el extremo equivocado del palo, ¡estoy seguro de que alguien pronto nos lo dirá!