スタックの一番上に launchMode=singleTask を持つアクティビティを使用してタスク バック スタックを作成する方法の例を教えてください。バック スタック内のアクティビティはこれだけではありません。
たとえば、次の図にそのようなタスクが 1 つあります (アクティビティ X と Y を含むタスク)。
私の知る限り、singleTask アクティビティはルート アクティビティであると想定されており、タスク要素を再配置することはできません。
前もって感謝します
スタックの一番上に launchMode=singleTask を持つアクティビティを使用してタスク バック スタックを作成する方法の例を教えてください。バック スタック内のアクティビティはこれだけではありません。
たとえば、次の図にそのようなタスクが 1 つあります (アクティビティ X と Y を含むタスク)。
私の知る限り、singleTask アクティビティはルート アクティビティであると想定されており、タスク要素を再配置することはできません。
前もって感謝します
Application14 つのアクティビティを
含むアプリを作成します。Activity1
exported="false"(つまり、true明示的または暗黙的のいずれかです) 。Activity2ActivityXActivityY
launchMode="singleTask"Activity1つのアクションを実装します。たとえば、それぞれが次のことを行う 2 つの異なるボタンです。
Activity2して終了するActivity2し、それ自体を終了しないActivity2つのアクションを実装します。
ActivityXして終了するActivityYし、それ自体を終了しないActivityX1 つのアクションを実装する
には:ActivityYし、それ自体を終了しないActivityY何もしない :)Application2アクティビティを使用して
別のアプリを作成します。AnotherActivity
AnotherActivity1 つのアクションを実装する
には:Activity1ます。次のように実行できます。 Intent intent = new Intent();
// package, fully qualified class name
intent.setComponent(new ComponentName(
"com.stackoverflow", "com.stackoverflow.Activity1");
startActivity(intent);
Application1、起動しますActivity1Activity1始めますActivity2Activity2始めますActivityXActivityX、開始ActivityYApplication2、起動しますAnotherActivityAnotherActivity、開始Activity1Activity1に開始するActivity2 Activity2に開始するActivityY ほらね。今すぐ戻るボタンでスタックをポップしてください。
実際、これを行うのはかなり簡単です。
で宣言されていてもX、ルートとYトップに含むタスクを生成するには:YlaunchMode="singleTask"
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<activity android:name=".X">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".Y" android:launchMode="singleTask"/>
</application>
アクティビティでは、次のようなアクティビティXを起動するだけYです:
startActivity(new Intent(this, SingleTaskActivity.class));
Xこれで、ルートにアクティビティYがあり、その上にアクティビティがあるタスクが作成されます。
Yこれは、次のように、新しいタスクで起動することを明示的に指定した場合でも発生します。
Intent intent = new Intent(this, SingleTaskActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
これは直感に反しているように見えますが、その理由は と の両方XがY同じtaskAffinity. そして、 taskAffinityAndroidlaunchModeがActivity.
taskAffinity、特に設定されていない場合、デフォルトでアプリケーションのパッケージ名になります。同じタスクを持つすべてのアクティビティはtaskAffinity、同じタスクで開始されます。
ドキュメントではあまり言及されていないため、これはほとんどの開発者を混乱させtaskAffinityます。
が常にそのタスクのルートであることを本当に確実にしたい場合はActivity、それがどのように起動されても、またはのいずれlaunchMode="singleTask"かを使用して、 にタスク アフィニティがないことを示す必要がlaunchMode="singleInstance" あります(つまり、属していません)。その他の活動)。taskAffinity=""Activity