no he probado a mí mismo, pero creo que la mejor opción sería la de refactorizar su aplicación para utilizar una pila de Fragment
s dentro de un solo Activity
(desde luego se puede administrar más fácilmente el backstack utilizando el proporcionó addToBackStack()
y popBackStack()
métodos). Básicamente, esto implica mover la mayor parte del código en su Actividad a un Fragmento y luego agregar el código de manipulación backstack en la Actividad). Puede ver el código para FragmentBreadCrumbs
(con API 11+) o el código para HanselAndGretel (para usar con la biblioteca de compatibilidad) para ver cómo se puede implementar esto.
Sin embargo, si desea continuar utilizando su enfoque actual de múltiples actividades, el siguiente es un código que surgió para ilustrar cómo puede hacerlo.
Primero, agregue varias clases internas para alias su actividad actual y ponga estas clases en una lista de secuencias (note también el método simplista getSequencedActivityIntent()
que escribí, puede agregar lógica más avanzada si necesita - tal vez use un HashMap para asociar cada clase en la secuencia con un valor de la variable 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
}
no se olvide de agregar sus entradas a su AndroidManifest.archivo XML también (singleTop
es opcional - que evitará que la instancia de actividad en la pila que se creará de nuevo cuando vuelva a la parte delantera):
<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" />
Ahora, cada vez que necesita para iniciar una nueva instancia "top" de su actividad, puede hacer algo como:
final Intent intent = getSequencedActivityIntent(+1);
if (intent == null) return;
intent.putExtra("dataset", dataSet);
startActivity(intent);
Y cuando se necesita para volver a uno de la instancia en el backstack que puede hacer:
final Intent intent = getSequencedActivityIntent(- stepBack);
if (intent == null) return;
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
si A y E son iguales, en lugar de llamar a E, ¿por qué no llamas a la actividad A de la historia? – Ishtiaq
He editado mi pregunta para que quede más clara. Todas las actividades tienen la misma clase. – Warlock
No puedo entender su problema. Por favor dime, ¿qué es malo? –