Mi piacerebbe che Attività sullo stack Attività della mia applicazione abbia solo un'istanza. Ho diverse schermate che sono ListActivities e mi piacerebbe non passare attraverso il dolore e la sofferenza dell'aggiornamento degli elenchi in un'istanza precedente di ListActivity quando viene modificata un'altra istanza di ListActivity (aggiunta, modificata, rimossa da, ecc.) (o c'è un modo semplice per farlo?).startActivityForResult non funziona correttamente con launchMode singleInstance
Nota: ho letto che singleTop lo farà (anche se distrugge l'attività se si preme il pulsante indietro), ma non funziona. Ho un menu e se vado nella schermata Posta in arrivo, vado alla schermata QuickList, quindi vado di nuovo nella schermata Posta in arrivo, crea una nuova Attività Posta in arrivo.
In questo momento, sul mio ListActivities, ho launchMode impostato su singleInstance. Il problema è: se lancio un'altra attività utilizzando startActivityForResult, il gestore onActivityResult si attiva immediatamente (prima che venga creata la nuova attività). Quando eseguo l'azione necessaria nella schermata successiva per restituire il risultato, il gestore onActivityResult non viene attivato.
Cosa sta succedendo?
Ecco come mi licenzio la nuova attività:
Intent intentLaunchQuickList = new Intent(ActivityMyList.this, ActivityQuickList.class);
startActivityForResult(intentLaunchQuickList, REQUEST_QUICKLIST);
Ecco come torno il risultato:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
QuickListItem qlItem = m_Adapter.getItem(position);
if (qlItem != null && qlItem.getQLId() != -1) {
Intent data = new Intent();
data.putExtra("ql_id", qlItem.getQLId());
if (getParent() == null) {
setResult(Activity.RESULT_OK, data);
}
else {
getParent().setResult(Activity.RESULT_OK, data);
}
}
finish();
}
Ecco il mio gestore onActivityResult:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_QUICKLIST) {
if (resultCode == Activity.RESULT_OK) {
Bundle extras = data.getExtras();
if (extras != null) {
int id = extras.getInt("ql_id");
if (id > 0) {
launchQLItemsThread(id);
}
}
}
}
}
Grazie per la risposta. Capisco cosa vuoi che faccia, tuttavia, non causerà problemi? Ovviamente dovrò fare la stessa cosa nei gestori onSaveInstanceState e onRestoreInstanceState. Se on onResume e onPause leggono e salvano le informazioni dal database, la mia applicazione leggerà inutilmente dal database e leggerà da SavedInstanceState se dovesse mai raggiungere il gestore onRestoreInstanceState, sì? Inoltre, questo è davvero ciò che è pratica comune per gli sviluppatori Android? Salvataggio dei dati di ListActivity su un singleton per più istanze di ListActivity? Ancora una volta, grazie per l'aiuto – Andrew
Inoltre, potresti spiegare perché singleTop non funziona per me? O non lo capisco? – Andrew
SavedInstanceState è utile solo per ripristinare lo stato di una particolare istanza di un'attività; usalo per salvare la posizione di scorrimento, ecc., non il contenuto della lista. Quello che vuoi fare è che tutte le istanze della tua attività condividano qualche stato, quindi vuoi mettere quello stato in un database se è persistente o in un membro statico se è solo una cache di dati dalla rete.Suggerisco quest'ultimo in base a ciò che hai detto; basta usare un DB per conservare i dati che devi ancora inviare in rete in futuro, in modo da non perderli. –