web-dev-qa-db-ja.com

Android singleTaskまたはsingleInstance起動モード?

メインのアクティビティとしてリストがあるアプリがあり、アイテムをクリックすると、そのアイテムの詳細ビューが開きます。また、メインアクティビティに似た検索アクティビティもあり、意図したとおりに動作します。

ただし、ユーザーが複数回検索してクリックすると、検索を開始する前の以前のビューに戻ることができるように、この検索アクティビティにはスタック上に1つのインスタンスのみが必要です(以前の検索結果に戻るのではなく)

singleTaskとsingelInstanceの両方の起動モードは、私が望むことを行うように見えるので、この目的のためにどちらを使用するべきか、そしてなぜですか?

84
Kman

Android devガイドの Application Fundamentals ページから:

デフォルトでは、アプリケーション内のすべてのアクティビティは互いに親和性があります。つまり、すべてのアクティビティが同じタスクに属するように設定されています。

「singleInstance」アクティビティは、タスク内の唯一のアクティビティとして単独で動作します。別のアクティビティを開始すると、そのアクティビティは、起動モードに関係なく、FLAG_ACTIVITY_NEW_TASKがインテントにあるかのように、別のタスクに起動されます。他のすべての点では、「singleInstance」モードは「singleTask」と同じです。

上記のように、「singleTask」または「singleInstance」アクティビティのインスタンスが複数存在することはないため、そのインスタンスはすべての新しいインテントを処理することが期待されています。 「singleInstance」アクティビティは常にスタックの一番上にあるため(タスク内の唯一のアクティビティであるため)、常にインテントを処理する位置にあります。ただし、「singleTask」アクティビティには、スタック内で他のアクティビティがある場合とない場合があります。存在する場合、インテントを処理する位置にないため、インテントは削除されます。 (インテントがドロップされたとしても、その到着によりタスクはフォアグラウンドに到達し、そこに残ります。)

4 Activities in a Task

どちらの起動モードでもアクティビティのインスタンスが複数存在することはないため、[戻る]ボタンをクリックすると、常にアクティビティの既存のインスタンスに移動します。

重要な違いは、「singleTask」では、何かが選択されたときに起動される新しいアクティビティの新しいタスクを作成する必要がないということです。また、毎回戻るボタンで新しいタスクを削除する必要もありません。

アクティビティスタックはすべて1人のユーザーの「タスク」に関係し、singleInstanceが常にそれらを処理するのに有益な複雑なIntent構造を持っているように聞こえないため、singleTask起動モードを使用することをお勧めします。

詳細については、ブログの投稿をご覧ください。画像の功績もあります。 Androidのアクティビティとタスクシリーズ– AndroidのUIコンポーネントモデルの概要

141
Guzba

簡単な方法で

singleTask:

システムは新しいタスクを作成し、新しいタスクのルートでアクティビティをインスタンス化します。ただし、アクティビティのインスタンスが別のタスクに既に存在する場合、システムは、新しいインスタンスを作成するのではなく、onNewIntent()メソッドの呼び出しを介して既存のインスタンスにインテントをルーティングします。一度に存在できるアクティビティはone instanceのみです。

注:アクティビティは新しいタスクで開始されますが、[戻る]ボタンをクリックしてもユーザーは前のアクティビティに戻ります。

singleInstance-

"singleTask"と同じですが、システムインスタンスを保持しているタスクに他のアクティビティを起動しませんです。アクティビティは常にそのタスクの唯一かつ唯一のメンバーです。 これによって開始されたアクティビティは、別のタスクで開かれます

30
Tarun Varshney

singleTaskおよびsingleInstanceアクティビティはタスクのみを開始できます。これらは常にアクティビティスタックのルートにあります。さらに、デバイスはアクティビティのインスタンスを一度に1つだけ保持できます。そのようなタスクは1つだけです。
詳細 Android:launchMode

4
Rupesh Yadav