2009-09-20 14 views
9

Tengo 3 actividades diferentes entre las que el usuario navega sin un orden en particular. Mi objetivo es doble:Android - restaurar la última actividad que se ha visto

  1. Cuando el usuario cambia a otra cosa cuando la aplicación se reanuda Quiero empezar donde el usuario deja incluso si la aplicación se terminó
  2. Cuando se reanuda la última actividad que quiero para restaurarlo a la última vista estado (éste creo que tengo una idea bastante buena de cómo achive)

Creo que el problema no es Start/Stop - donde yo más o menos lo que necesito, pero onCreate() si se terminó aplicación . En ese caso, selecciona la Actividad que configuré en el manifiesto. Supongo que puedo poner algo en el método onCreate() de esa actividad predeterminada, pero ¿hay alguna manera mejor de que me esté perdiendo?

Respuesta

6

Si su aplicación no se ha "terminado" y luego # 1 ya debería trabajar y # 2 sólo requiere guardar los valores que no son administrados automagicamente en el paquete de onSaveInstanceState() luego restaurarlos en onRestoreInstanceState().

Esto es un truco, pero creo que su mejor opción para el n. ° 1 en el caso de que la aplicación realmente se termine sería guardar la Actividad más reciente en el onResume de cada una de sus clases de Actividad cuando la primera vez ejecute onCreate de su primera actividad, haga un control y luego inicie la Actividad correcta ... tal vez incluso ponga en blanco una Actividad al comienzo. Algo como esto:

startActivity:

public class StartActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // get last open Activity 
     String lastActivity = PreferenceManager.getDefaultSharedPreferences(this).getString("last_activity", ""); 
     if (last_activity == MyActivity2.getSimpleName()) { 
      startActivityForResult(new Intent(this, MyActivity2.class)); 
     } else if (last_activity == MyActivity3.getSimpleName()) { 
      startActivityForResult(new Intent(this, MyActivity3.class)); 
     } else { 
      // assume default activity 
      startActivityForResult(new Intent(this, MyActivity1.class)); 
     } 
    } 

    public void onActivityResult() { 
     // kill the activity if they go "back" to here 
     finish(); 
    } 
} 

Luego, en todas las otras actividades (MyActivity1,2,3) guardar los valores de este modo:

@Override 
public void onResume() { 
    Editor e = PreferenceManager.getDefaultSharedPreferences(this).edit(); 
    e.putString("last_activity", getClass().getSimpleName()); 
    e.commit(); 

    super.onResume(); 
} 

También tendrá que manejar guardando/restaurando los datos para cada actividad manualmente. Puede guardar todos los valores que necesita en las preferencias dentro de onPause() de cada una de las Actividades y restaurarlas en onResume().

+0

Gracias, fiXedd, no creo que sea un truco. Suena como un patrón de despachador. Solo esperaba que me estaba perdiendo algo y hay una forma más fácil de hacerlo. – Bostone

+0

¿Qué tal comenzar startActivity y luego terminar() en lugar de startActivityForResult? –

+0

También preste atención a la configuración de launchMode de su actividad en el manifiesto. Lo configuré en "singleTask" pero lo cambié a "singleTop" para permitir que se reanude correctamente la última actividad. Encontré una buena explicación en http://www.intridea.com/blog/2011/6/16/android-understanding-activity-launchmode –

0

Creo que desea implementar onSaveInstanceState y que almacenará el estado actual de sus actividades en un paquete. Ese paquete pasará a su actividad en onCreate y puede usarlo para restablecer sus valores.

http://developer.android.com/guide/topics/fundamentals.html#actstate

+0

Eso va sobre todo para # 2 como yo lo entiendo. Necesito elegir la actividad que el usuario estaba viendo la última vez. Luego puedo restablecer su estado – Bostone

1

Tenga en cuenta que onSaveInstanceState() no es viable para el estado a largo plazo, es decir, el usuario enciende el teléfono y lo vuelve a encender en un momento indeterminado. Tendrá que crear su propio mecanismo de estado a largo plazo si desea que su estado sobreviva a los ciclos de encendido.

Cuestiones relacionadas