AndroidのsingleTaskまたはsingleInstance起動モード?[閉まっている]


84

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

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

singleTaskとsingelInstanceの両方の起動モードが私が望むことを実行しているように見えるので、この目的でどちらを使用すべきか、そしてその理由がわかりません。

回答:


141

Android開発ガイドのアプリケーションの基礎ページから:

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

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

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

タスク内の4つのアクティビティ

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

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

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

これは、詳細と画像のクレジットについての優れたブログ投稿です:Androidアクティビティとタスクシリーズ–AndroidのUIコンポーネントモデルの紹介


4
ありがとう!よく読んだように見えます...実際にはアクティビティの複数のインスタンスが必要であり、フォアグラウンドアクティビティが検索アクティビティであり、別の検索が実行された場合にのみ、既存のアクティビティ(市場の仕組みなど)を使用する必要があることに気づきました。そのため、singeTopはまさにImの後のものですが、とにかく助けてくれてありがとう=)ありがとう
Kman 2010

1
ねえ、ありがとう。このよく書かれた投稿は、ピンチで私を助けました。
アイスクリームマン2011

詳細、特にこれに感謝します(意図が失われたとしても、その到着によりタスクが前面に出て、そこに残ります)。これにより、私の混乱がすぐに解消されます。を指定せずに移動したいのに、singleTaskアクティビティがスタックの一番上にない場合はどうなるかを考えていましたFLAG_ACTIVITY_CLEAR_TOP
neevek 2013


30

簡単な方法で-

singleTask:

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

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

singleInstance-

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


4

singleTaskそしてsingleInstance活動にのみタスクを開始することができます。それらは常にアクティビティスタックのルートにあります。さらに、デバイスは一度に1つのアクティビティのインスタンスのみを保持できます—そのようなタスクは1つだけです。
より多くのandroid:launchModeの場合


1
最後の文はsingleInstance、ないsingleTaskについても同様です
セルダルSamancıoğlu

@SerdarS。コメントありがとうございます。詳細の追加singleTask-システムは新しいタスクを作成し、新しいタスクのルートでアクティビティをインスタンス化します。ただし、アクティビティのインスタンスが別のタスクにすでに存在する場合、システムはonNewIntent()、新しいインスタンスを作成するのではなく、メソッドの呼び出しを通じてインテントを既存のインスタンスにルーティングします。アクティビティのインスタンスは一度に1つだけ存在できます。以下のためのより多くのdeveloper.android.com
Rupesh Yadavが

了解しました、それから私は間違っていました。ご迷惑をおかけして申し訳ありません。
セルダルSamancıoğlu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.