3

スタックの一番上に launchMode=singleTask を持つアクティビティを使用してタスク バック スタックを作成する方法の例を教えてください。バック スタック内のアクティビティはこれだけではありません。

たとえば、次の図にそのようなタスクが 1 つあります (アクティビティ X と Y を含むタスク)。

ここに画像の説明を入力

私の知る限り、singleTask アクティビティはルート アクティビティであると想定されており、タスク要素を再配置することはできません。

前もって感謝します

4

2 に答える 2

0
  1. Application14 つのアクティビティを 含むアプリを作成します。
    • Activity1
      • そうでない ことを確認してくださいexported="false"(つまり、true明示的または暗黙的のいずれかです) 。
      • ランチャーにする
    • Activity2
    • ActivityX
    • ActivityY
      • それは1つです:launchMode="singleTask"
  2. 2Activity1つのアクションを実装します。たとえば、それぞれが次のことを行う 2 つの異なるボタンです。
    • 自分自身を開始Activity2して終了する
    • 開始Activity2し、それ自体を終了しない
  3. 2Activity2つのアクションを実装します。
    • 自分自身を開始ActivityXして終了する
    • 開始ActivityYし、それ自体を終了しない
  4. ActivityX1 つのアクションを実装する には:
    • 開始ActivityYし、それ自体を終了しない
  5. ActivityY何もしない :)
  6. Application2アクティビティを使用して 別のアプリを作成します。
    • AnotherActivity
      • ランチャーにする
  7. AnotherActivity1 つのアクションを実装する には:
    • 開始しActivity1ます。次のように実行できます。
        Intent intent = new Intent();
        // package, fully qualified class name
        intent.setComponent(new ComponentName(
            "com.stackoverflow", "com.stackoverflow.Activity1");
        startActivity(intent);
  1. Launch Application1、起動しますActivity1
  2. で、自分自身を仕上げActivity1始めますActivity2
  3. で、自分自身を仕上げActivity2始めますActivityX
  4. ActivityX、開始ActivityY
  5. ホームを押す
  6. Launch Application2、起動しますAnotherActivity
  7. AnotherActivity、開始Activity1
  8. では、それ自体を終了せずActivity1に開始するActivity2
  9. では、それ自体を終了せずActivity2に開始するActivityY

ほらね。今すぐ戻るボタンでスタックをポップしてください。

于 2016-10-25T22:01:19.333 に答える
0

実際、これを行うのはかなり簡単です。

で宣言されていても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);

これは直感に反しているように見えますが、その理由は と の両方XY同じtaskAffinity. そして、 taskAffinityAndroidlaunchModeActivity.

taskAffinity、特に設定されていない場合、デフォルトでアプリケーションのパッケージ名になります。同じタスクを持つすべてのアクティビティはtaskAffinity、同じタスクで開始されます。

ドキュメントではあまり言及されていないため、これはほとんどの開発者を混乱させtaskAffinityます。

が常にそのタスクのルートであることを本当に確実にしたい場合はActivity、それがどのように起動されても、またはのいずれlaunchMode="singleTask"かを使用して、 にタスク アフィニティがないことを示す必要がlaunchMode="singleInstance" あります(つまり、属していません)。その他の活動)。taskAffinity=""Activity

于 2016-12-28T14:46:13.627 に答える