我自己没有尝试过,但我认为最好的选择是重构您的应用程序以Fragment
在单个中使用 s堆栈Activity
(因为您可以使用提供的addToBackStack()
和popBackStack()
方法更轻松地管理后台堆栈)。基本上,这涉及将 Activity 中的大部分代码移动到 Fragment 中,然后在 Activity 中添加 backstack 操作代码)。您可以查看FragmentBreadCrumbs
(使用 API 11+)的代码或HanselAndGretel的代码(用于与兼容性库一起使用),以了解如何实现。
但是,如果您想继续使用当前的多活动方法,以下是我想出的一些代码来说明如何做到这一点。
首先,添加几个内部类来为您当前的 Activity 设置别名,并将这些类放入序列列表中(还要注意getSequencedActivityIntent()
我编写的简单方法,如果需要,您可以添加更高级的逻辑 - 可能使用 HashMap 来关联序列中的每个类带有任意标签值?):
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
}
不要忘记将它们的条目也添加到您的 AndroidManifest.xml 文件中(singleTop
是可选的 - 它会阻止堆栈中的 Activity 实例在返回到前面时再次创建):
<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" />
现在,每当您需要启动 Activity 的新“顶级”实例时,您可以执行以下操作:
final Intent intent = getSequencedActivityIntent(+1);
if (intent == null) return;
intent.putExtra("dataset", dataSet);
startActivity(intent);
当您需要返回后台堆栈中的一个实例时,您可以执行以下操作:
final Intent intent = getSequencedActivityIntent(- stepBack);
if (intent == null) return;
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);