launchMode
のは無視されますかlauncher activity
? ドキュメントには、デフォルトは「標準」でmanifest
あると書かれていますが、アプリを起動するたびに別のアプリが作成されるため、これがアプリのメイン アクティビティに適用される場合、これは論理的ではありません。android
launchMode
task
instance
5 に答える
あなたは2つのことを混同しています。1つはlaunchMode
、「ユーザーがホーム画面からアプリのアイコンを選択したとき、または最近のタスクのリストからタスクを選択したときに何が起こるか」です。これらは2つの完全に異なるものです。
launchMode
それぞれActivity
に が指定されていますlaunchMode
(デフォルトは"standard"
または"multiple"
です。これは Android に this を開始する方法を伝えActivity
、 の「解釈」に寄与する可能性のある多くの要因があります。それは、使用launchMode
されている他のフラグが指定されている可能性があることに依存します。依存します。Intent
どのタスクが の起動を要求したActivity
か (または や などの非アクティビティ コンテキストから起動が要求されたService
場合) の既存のインスタンスが指定されたタスクで既にアクティブであるBroadcastReceiver
かどうかなどによって異なります。Activity
HOME画面やインストール済みアプリ一覧からアプリアイコンを選択した際の挙動
ユーザーがアプリ アイコンを選択すると 、次のデータを含むstartActivity()
で呼び出されます。Intent
- アクション=メイン
- カテゴリー=ランチャー
Activity
コンポーネントは、マニフェストで ACTION=MAIN および CATEGORY=LAUNCHER で定義されているパッケージ名とクラス名に設定されます- フラグ
FLAG_ACTIVITY_NEW_TASK
とFLAG_ACTIVITY_RESET_TASK_IF_NEEDED
が設定されます。
launchMode
起動する の定義に関係なく、 like thisActivity
で呼び出すstartActivity()
とIntent
、次の動作が発生します。
タスク アフィニティActivity
が開始されているものと一致する既存のタスクが既に存在する場合 (簡単に言えば、アプリが既に実行されている場合)、Android は単に既存のタスクをフォアグラウンドに移動します。それでおしまい。のインスタンスは作成しませんActivity
。を呼び出しませonNewIntent()
んActivity
。既存のタスクをフォアグラウンドに移動する以外は何もしません。これがlaunchMode="standard"
、 launcher を指定した場合でもActivity
、アプリのアイコンをクリックするたびに Android が新しいインスタンスを作成しない理由です。
開始されたものと一致するタスク アフィニティを持つ既存のタスクがまだない場合Activity
(簡単に言えば、アプリがまだ実行されていない場合)、Android は新しいタスクを作成し、Activity
そのタスクに を起動します。シングルを新しいタスクlaunchMode
に起動するとき、起動モード間にまったく違いがないため、ここでは役割を果たしません。Activity
Android は常に新しいタスクを作成し、常にActivity
そのタスクのルートとして の新しいインスタンスを作成します。
この動作は、ユーザーが最近のタスクのリストからタスクを選択した場合も同じです。タスクがまだ実行中の場合、Android はタスクをフォアグラウンドに移動するだけで、新しいActivity
インスタンスを開始せず、onNewIntent()
. タスクが実行されていない場合、Android は新しいタスクを作成し、ランチャーActivity
をそのタスクに起動します。ここでの唯一の違いは、ユーザーが最近のタスクのリストからタスクを選択FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
した場合にもフラグが設定されることです。Intent
これがあなたの質問に答えることを願っています。
一般的なタスクの再親化の非常に詳細な説明については、この回答を参照してください。FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
標準モードに設定されたアクティビティの動作は、新しいアクティビティが常に作成され、送信された各インテントで個別に動作します。メールを作成するために 10 個のインテントが送信された場合、各インテントを個別に提供するために 10 個のアクティビティを起動する必要があると想像してください。その結果、デバイスで起動されるこの種のアクティビティが無制限に存在する可能性があります。
Lollipop より前の Android での動作
標準のアクティビティが作成され、インテントを送信したタスクと同じタスクでスタックの一番上に配置されます。たとえば、ギャラリーから標準のアクティビティに画像を共有すると、別のアプリケーションからのものですが、説明したように同じタスクにスタックされます。アプリケーションを別のアプリケーションに切り替えてから Gallery に戻しても、Gallery のタスクの上に標準の launchMode が配置されていることがわかります。その結果、Gallery で何かを行う必要がある場合は、最初に追加の Activity で作業を完了する必要があります。
Android Lollipop での動作
アクティビティが同じアプリケーションからのものである場合、Lollipop 以前と同じように機能し、タスクの上に積み上げられます。ただし、インテントが別のアプリケーションから送信された場合。新しいタスクが作成され、新しく作成されたアクティビティが以下のようにルート アクティビティとして配置されます。
ソースはこちらから