2009-09-20 12 views
9

Ho 3 diverse attività in cui l'utente naviga tra un ordine particolare. Il mio obiettivo è duplice:Android - ripristina ultimo visualizzato Attività

  1. Quando l'utente passa a qualcosa di diverso quando un'applicazione viene ripreso voglio iniziare in cui l'utente ha lasciato, anche se l'applicazione è stata terminata
  2. L'ultima volta che l'attività è ripresa voglio ripristinare l'ultima vista stato (questo penso di avere una buona idea su come achive)

credo che il problema non è avvio/arresto - dove ho tranquillamente ottenere quello che mi serve, ma onCreate() se applicazione è stata terminata . In tal caso, seleziona Attività che ho configurato nel manifest. Suppongo di poter mettere qualcosa nel metodo onCreate() di quell'attività predefinita ma c'è un modo migliore che forse mi manca?

risposta

6

Se l'applicazione non è stato "terminato" poi 1 # dovrebbe già lavorare e # 2 richiede solo salvare i valori che non sono gestiti automagicamente nel Bundle in onSaveInstanceState() poi ripristinarli nei onRestoreInstanceState().

Questo è un po 'un hack, ma penso che la tua migliore opzione per il # 1 nel caso in cui l'app venga effettivamente terminata sarebbe quella di salvare l'attività più recente nel campo onResume di ciascuna delle tue classi di attività, quando la prima volta esegui il onCreate della tua prima attività esegui un controllo, quindi avvia l'attività corretta ... magari anche inserendo un'attività vuota all'inizio. Qualcosa di simile a questo:

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(); 
    } 
} 

Poi in tutte le altre attività (MyActivity1,2,3) Salvare i valori in questo modo:

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

    super.onResume(); 
} 

avrete anche per gestire salvataggio/ripristino manuale dei dati per ciascuna attività. È possibile salvare tutti i valori necessari nelle preferenze all'interno di onPause() di ciascuna attività, quindi ripristinarli nel menu onResume().

+0

Grazie fiXedd, non penso che questo sia un trucco. Sembra un modello di dispatcher. Speravo solo che mi mancasse qualcosa e che ci sia un modo più semplice per farlo. – Bostone

+0

Che ne dici di startActivity e poi solo finish() invece di startActivityForResult? –

+0

Prestare attenzione anche all'impostazione di avvio della propria attività nel manifest. L'ho impostato su "singleTask" ma l'ho cambiato in "singleTop" per consentire di riprendere correttamente l'ultima attività. Ho trovato una bella spiegazione su http://www.intridea.com/blog/2011/6/16/android-understanding-activity-launchmode –

0

Credo che si voglia implementare onSaveInstanceState e che memorizzerà lo stato corrente delle attività in un pacchetto. Tale pacchetto verrà trasferito nella tua attività in onCreate e potrai utilizzarlo per ripristinare i tuoi valori.

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

+0

Questo vale per lo più per # 2, come ho capito. Devo selezionare l'attività che l'utente stava visualizzando per ultima. Quindi posso ripristinare il suo stato – Bostone

1

Tenere presente che onSaveInstanceState() non è utilizzabile per lo stato a lungo termine, ovvero l'utente spegne il telefono e quindi lo riaccende in un punto indeterminato in un secondo momento. Dovrai creare il tuo meccanismo di stato a lungo termine se desideri che il tuo stato sopravviva ai cicli di alimentazione.