2010-01-13 12 views
13

En mi aplicación para Android, tengo una actividad principal que sirve como punto de entrada a mi solicitud, que se configura en mi archivo de manifiesto de la siguiente manera:retención de estado de la aplicación de Android con alwaysRetainTaskState y lauchMode

<activity android:name=".Main" 
       android:label="@string/app_name" 
       android:screenOrientation="portrait" 
       android:alwaysRetainTaskState="true" 
       android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

Así que para un caso de uso particular, digamos que un usuario inicia la aplicación desde la pantalla de inicio haciendo clic en el ícono dentro del iniciador de la aplicación. Después de iniciar la aplicación, el usuario navega de la actividad Principal a la actividad A y finalmente a la actividad B. En este punto, el usuario decide verificar su Facebook, por lo que hace clic en el botón de inicio para poner mi aplicación en segundo plano y se inicia la aplicación de Facebook.

Después de verificar su Facebook, el usuario desea volver a mi aplicación, por lo que presiona la tecla de inicio y la inicia desde el iniciador de aplicaciones (tal como lo hicieron la primera vez que se lanzó).

Cuando un usuario vuelve a mi aplicación, quiero que la aplicación regrese a la última actividad en la que se encontraba el usuario cuando la aplicación se puso en segundo plano, que en este caso es actividad B. En el archivo de manifiesto, tengo establezca alwaysRetainTaskState = true para asegurarse de que el sistema operativo no mate las actividades de mi aplicación.

Ahora a mi pregunta: ¿cómo obtengo el comportamiento que describí anteriormente? Cada vez que hago clic en el ícono de mi aplicación, siempre comienza en la actividad Principal, no importa qué. Creo que esto se debe al atributo category.LAUNCHER. He intentado con Android: launchMode = singleTask, pero no ha marcado la diferencia; siempre comienza en Main.

¡Si alguien pudiera aclarar los filtros de intención, los modos de lanzamiento y las tareas, sería genial!

+0

Creo que esta pregunta es demasiado viejo, y debería actualizarse accrding a http://developer.android.com /guide/components/tasks-and-back-stack.html –

Respuesta

3

Lo resolví agregando el DispatcherActivity sin pantalla y convirtiéndolo en el predeterminado (usando el mismo filtro de intención). En su método onCreate, usted crea y llama al Intento basándose en algún valor razonable predeterminado (su actividad Principal, por ejemplo) O en base a un token guardado que identifica qué Actividad se debe iniciar. Ese token se guarda/actualiza en el método onStop de cualquier actividad que desee llamar al reiniciar. Puede guardar este token en Preferencias.

Lo racional aquí es que la última actividad que estaba visible se ejecutará en el método de parada cuando se interrumpa.

Palabra de advertencia aquí: Implementé este patrón y funcionó razonablemente bien. Sin embargo, parece que no juega muy bien con la historia y finalmente me rendí y saqué este código. Nadie se ha quejado hasta ahora.

+0

esa es una solución intuitiva. si vuelves a mi ejemplo, si almacené un token en la actividad B's onStop, y comprobé este token en la actividad DispatcherActivity y comencé la actividad B cuando se establece el token, eso te llevaría de vuelta a la última actividad, pero no lo haría usted tiene que almacenar un token para las actividades que el usuario visitó antes de B también (actividad A en mi ejemplo)? – jlim

+0

Sorprendentemente, no. Creo que debido al almacenamiento en caché de información, su actividad B no se recrea desde cero y conserva su historial. Entonces, por ejemplo, cuando presiona el botón Atrás sabrá ir a la Actividad de la persona que llama. Entonces, una de las cosas que debe hacer cuando llama a la actividad desde el despachador también debe ejecutar finish() para que no se vuelva a llamar al Dispatcher cuando haga clic en el botón – Bostone

+0

. Tengo la sensación de que hay una mejor manera de hacerlo. .el menú del selector de aplicaciones (mantenga presionada la tecla de inicio) lo maneja muy bien ... no veo por qué no podemos duplicar ese comportamiento en la bandeja de aplicaciones ... – jlim

8

FYI singleTask no es lo que quiere, ya que comienza una nueva tarea:

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

¿Cómo estás poniendo en marcha la actividad B? ¿Cualquier modo de lanzamiento no estándar o indicadores de intención?

+0

no, no tengo filtros de intención establecidos para B, y simplemente estoy haciendo una startActivity (nueva intención (this, B.class)); – jlim

+2

sí No sé por qué tantas respuestas de SO a preguntas como esta (aplicación reanudar, etc.) sugieren el uso de singleTask, simplemente no es lo que generalmente querrías ... –

+0

¡Estás absolutamente en lo cierto! En mi caso, singleTask fue la causa de este problema. – Apfelsaft

7

Para cualquiera que venga aquí con problemas similares, he encontrado algo extraño que podría ser lo que está viendo ... tal vez.

Digamos que tengo una aplicación con actividades A -> B -> C, etc. Estaba teniendo problemas con mi aplicación siempre "reanudando" a A si se lanzó desde la lista de aplicaciones aka launcher. Reanudar desde la pantalla de "resentimiento" (larga pulsación de inicio) mostraría un comportamiento correcto de reanudación (reanudar a B o C como se esperaba). Mi manifiesto no era nada especial, siempre he fijadoRetainTaskState = "true" en mi actividad raíz, y el modo de inicio es por defecto (estándar).

Estaba cargando la aplicación en mi teléfono a través de un sitio web. Después de descargar e instalar, presionaría "Abrir" para iniciar la aplicación de inmediato. Por alguna razón (después de desinstalar la aplicación) me cansé de descargar de nuevo, instalando, pero luego I presionó el botón "Listo" en su lugar. Luego, al iniciar la aplicación desde la lista de inicio/"todas las aplicaciones", tengo el mismo comportamiento de reanudación que reanudar desde recientes; en otras palabras, mis problemas se debieron al proceso de instalación al hacer clic en "Abrir" en lugar de "Hecho".

verifiqué esta "solución" en API10 (2.3.5) y API15 (4.0.4)

+0

¿Alguna vez encontró una solución para esto ????? –

+4

No. Hay un error al respecto aquí (creado por otra persona): https://code.google.com/p/android/issues/detail?id=38194&q=app+resume+open+done&colspec=ID+Type + Estado + Propietario + Resumen + Estrellas Me resulta difícil entender cómo no hay más personas molestas por este comportamiento: / –

Cuestiones relacionadas