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