Non ho provato io stesso, ma penso che la soluzione migliore sarebbe quella di refactoring la vostra applicazione per utilizzare una pila di Fragment
s all'interno di un singolo Activity
(perché si può quindi gestire più facilmente la backstack utilizzando il fornito i metodi addToBackStack()
e popBackStack()
). Fondamentalmente ciò comporta lo spostamento della maggior parte del codice nella tua attività in un frammento e l'aggiunta del codice di manipolazione del backstack nell'attività). Puoi vedere il codice per FragmentBreadCrumbs
(con API 11+) o il codice per HanselAndGretel (da usare con la libreria di compatibilità) per vedere come questo può essere implementato.
Tuttavia, se si desidera continuare a utilizzare il proprio attuale approccio multi-attività, quanto segue è un codice che ho trovato per illustrare come è possibile farlo.
Innanzitutto, aggiungi diverse classi interne per creare alias l'attività corrente e inserisci queste classi in un elenco di sequenze (osserva anche il semplicistico metodo getSequencedActivityIntent()
che ho scritto, puoi aggiungere una logica più avanzata se necessario, magari usare una HashMap da associare ogni classe nella sequenza, con un valore di variabile arbitraria):?
public class MyActivity extends Activity {
public static class A extends MyActivity {}
public static class B extends MyActivity {}
public static class C extends MyActivity {}
public static class D extends MyActivity {}
public static class E extends MyActivity {}
public static class F extends MyActivity {}
public static class G extends MyActivity {}
public static class H extends MyActivity {}
public static class I extends MyActivity {}
public static class J extends MyActivity {}
private final static List<Class<?>> SEQUENCE = Arrays.asList(new Class<?>[] {
A.class, B.class, C.class, D.class, E.class,
F.class, G.class, H.class, I.class, J.class,
});
private Intent getSequencedActivityIntent(int step) {
final int current = SEQUENCE.indexOf(this.getClass());
if (current == -1) new Intent(this, SEQUENCE.get(0));
final int target = current + step;
if (target < 0 || target > SEQUENCE.size() - 1) return null;
return new Intent(this, SEQUENCE.get(target));
}
// the rest of your activity code
}
non dimenticare di aggiungere le loro voci al vostro AndroidManifest.file xml troppo (singleTop
è facoltativo - impedirà l'istanza di attività nello stack da creare di nuovo quando riportato in primo piano):
<activity android:name=".MyActivity$A" android:launchMode="singleTop" />
<activity android:name=".MyActivity$B" android:launchMode="singleTop" />
<activity android:name=".MyActivity$C" android:launchMode="singleTop" />
<activity android:name=".MyActivity$D" android:launchMode="singleTop" />
<activity android:name=".MyActivity$E" android:launchMode="singleTop" />
<activity android:name=".MyActivity$F" android:launchMode="singleTop" />
<activity android:name=".MyActivity$G" android:launchMode="singleTop" />
<activity android:name=".MyActivity$H" android:launchMode="singleTop" />
<activity android:name=".MyActivity$I" android:launchMode="singleTop" />
<activity android:name=".MyActivity$J" android:launchMode="singleTop" />
Ora, ogni volta che è necessario avviare una nuova istanza "top" della la vostra attività, è possibile fare qualcosa di simile:
final Intent intent = getSequencedActivityIntent(+1);
if (intent == null) return;
intent.putExtra("dataset", dataSet);
startActivity(intent);
E quando si ha bisogno di tornare a uno dei esempio nel backstack si può fare:
final Intent intent = getSequencedActivityIntent(- stepBack);
if (intent == null) return;
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
se A ed E sono uguali, invece di chiamare E perché non si chiama l'attività A dalla cronologia? – Ishtiaq
Ho modificato la mia domanda per renderla più chiara. Tutte le attività hanno la stessa classe. – Warlock
Non capisco il tuo problema. Per favore dimmi, cosa c'è di male? –