studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android android-intent android-activity android-lifecycle

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á!