2010-03-14 19 views
35

¿Es posible configurar una aplicación de Android para que si un usuario abre su aplicación, inicia numerosas actividades, luego regresa a la pantalla de inicio y vuelve a lanzar su aplicación, en lugar de dirigirse a la actividad principal, en su lugar será llevado al actividad más alta en la pila (la actividad más reciente en su aplicación)?¿Cómo hacer que una aplicación de Android regrese a la última actividad abierta cuando se vuelve a lanzar?

+0

solución mejor y más limpia: http://stackoverflow.com/ a/10598619/5494342 – Mo12

+0

Para el registro, el comentario anterior es discutible. También podría decir que la respuesta en ese enlace es poco elegante aunque posiblemente aceptable, y viene con el inconveniente de que no funcionará el 100% del tiempo. Vea los comentarios en la respuesta aceptada de esta pregunta antes de decidir qué solución funciona para su situación. – Donamite

Respuesta

46

Cuando se inicia mediante un icono en la pantalla de inicio, Android siempre iniciará la actividad con el filtro android.intent.action.MAIN en su AndroidManifest.xml, a menos que la aplicación ya esté en ejecución (en cuyo caso obviamente restaurará la actividad en la parte superior de la pila).

Para lograr lo que usted describe se puede almacenar simplemente la última actividad visible en SharedPreferences y tienen una actividadDispatcher que se inicia la última actividad en función de las preferencias.

Así que en cada actividad que desea volver a iniciar de forma automática:

@Override 
protected void onPause() { 
    super.onPause(); 

    SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE); 
    Editor editor = prefs.edit(); 
    editor.putString("lastActivity", getClass().getName()); 
    editor.commit(); 
} 

Y un actividad Dispatcher similar a los siguientes:

public class Dispatcher extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Class<?> activityClass; 

     try { 
      SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE); 
      activityClass = Class.forName(
       prefs.getString("lastActivity", Activity1.class.getName())); 
     } catch(ClassNotFoundException ex) { 
      activityClass = Activity1.class; 
     } 

     startActivity(new Intent(this, activityClass)); 
    } 
} 

Observaciones

  • Usted podría crear una clase base para anular
  • El actividad Dispatcher, obviamente, tiene que ser la acción android.intent.action.MAIN
+0

Gracias por esto. He visto otras respuestas que ahora me dicen que lo que estoy buscando es realmente el comportamiento predeterminado y que solo estaba el hecho de que estaba usando eclipse (y aún no se actualizó a 0.9.6 del complemento) que causaba mi problema. Entonces, creo que no tengo que incorporar su solución. ¿Es eso correcto? ¿O hay otra razón por la que necesitaría seguir tu idea de manera programática? – JohnRock

+2

@johnrock: Android crea una pila que se usa para encontrar la última actividad visible * mientras tu aplicación se está ejecutando *. Desafortunadamente, nunca se sabe cuándo se mata su aplicación, por lo que si * siempre * desea restaurar la última actividad (incluso bajo presión de memoria, después del reinicio, etc.), entonces necesita algo similar a lo que propuse. Si estás de acuerdo * la mayor parte del tiempo *, no lo haces. –

+0

Hola, solo quería agregar que el comportamiento previsto no funciona, como se supone, ni siquiera "la mayoría de las veces". He descrito el problema aquí http://stackoverflow.com/questions/6903761/after-home-button-press-re-launching-app-shows-intial-activity-not-current/6903958#6903958 –

3

Este es el comportamiento predeterminado y esta pregunta se ha hecho varias veces antes: Android: keep task's activity stack after restart from HOME
Android Run application from last Activity

Nota que si está lanzando su aplicación desde Eclipse, eso es lo que rompe esta funcionalidad predeterminada. Cambiar la configuración de inicio para iniciar ninguna actividad debería arreglar las cosas.

Sin embargo, como este comportamiento se fijó en el 0.9.6 release del ADT plugin para Eclipse en las últimas semanas, ya no es necesario que la solución:

Aplicaciones lanzado desde ADT ahora se comportan como si se ha hecho clic desde la pantalla de inicio.

+0

Ese es solo el caso * cuando la aplicación ya se está ejecutando *. Como nunca se puede saber, yo mismo lo manejaría. Edité mi respuesta para aclarar. –

4

No es tan complejo. Solo necesitas manipular el manifiesto.

AndroidManifest.XM

<activity 
    android:name=".MainActivity" 
    android:alwaysRetainTaskState="true" 
    android:exported="true" 
    . 
    . 
    . 

Lea sobre el 'android: exportada' & 'android: alwaysRetainTaskState' aquí:

android:exported

android:alwaysRetainTaskState

Cuestiones relacionadas