私はそれを自分で試したことはありませんが、アプリをリファクタリングしFragment
て単一の s のスタックを使用するのが最善の方法だと思います (提供されたandメソッドActivity
を使用してバックスタックをより簡単に管理できるため)。基本的にこれには、アクティビティ内のほとんどのコードをフラグメントに移動してから、バックスタック操作コードをアクティビティに追加する必要があります)。(API 11+ を使用する) のコードまたは(互換性ライブラリで使用する) HanselAndGretelのコードを見て、これを実装する方法を確認できます。addToBackStack()
popBackStack()
FragmentBreadCrumbs
ただし、現在のマルチ アクティビティ アプローチを引き続き使用したい場合は、これを行う方法を説明するために私が思いついたコードを次に示します。
まず、いくつかの内部クラスを追加して現在のアクティビティのエイリアスを作成し、これらのクラスをシーケンス リストに配置します (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" />
これで、アクティビティの新しい「トップ」インスタンスを開始する必要があるときはいつでも、次のようなことができます:
final Intent intent = getSequencedActivityIntent(+1);
if (intent == null) return;
intent.putExtra("dataset", dataSet);
startActivity(intent);
バックスタック内のインスタンスの 1 つに戻る必要がある場合は、次のようにします。
final Intent intent = getSequencedActivityIntent(- stepBack);
if (intent == null) return;
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);