18

launchModeのは無視されますかlauncher activity? ドキュメントには、デフォルトは「標準」でmanifestあると書かれていますが、アプリを起動するたびに別のアプリが作成されるため、これがアプリのメイン アクティビティに適用される場合、これは論理的ではありません。androidlaunchModetaskinstance

4

5 に答える 5

8

あなたは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_TASKFLAG_ACTIVITY_RESET_TASK_IF_NEEDEDが設定されます。

launchMode起動する の定義に関係なく、 like thisActivityで呼び出すstartActivity()Intent、次の動作が発生します。

タスク アフィニティActivityが開始されているものと一致する既存のタスクが既に存在する場合 (簡単に言えば、アプリが既に実行されている場合)、Android は単に既存のタスクをフォアグラウンドに移動します。それでおしまい。のインスタンスは作成しませんActivity。を呼び出しませonNewIntent()Activity。既存のタスクをフォアグラウンドに移動する以外は何もしません。これがlaunchMode="standard"、 launcher を指定した場合でもActivity、アプリのアイコンをクリックするたびに Android が新しいインスタンスを作成しない理由です。

開始されたものと一致するタスク アフィニティを持つ既存のタスクがまだない場合Activity(簡単に言えば、アプリがまだ実行されていない場合)、Android は新しいタスクを作成し、Activityそのタスクに を起動します。シングルを新しいタスクlaunchModeに起動するとき、起動モード間にまったく違いがないため、ここでは役割を果たしません。ActivityAndroid は常に新しいタスクを作成し、常にActivityそのタスクのルートとして の新しいインスタンスを作成します。

この動作は、ユーザーが最近のタスクのリストからタスクを選択した場合も同じです。タスクがまだ実行中の場合、Android はタスクをフォアグラウンドに移動するだけで、新しいActivityインスタンスを開始せず、onNewIntent(). タスクが実行されていない場合、Android は新しいタスクを作成し、ランチャーActivityをそのタスクに起動します。ここでの唯一の違いは、ユーザーが最近のタスクのリストからタスクを選択FLAG_ACTIVITY_LAUNCHED_FROM_HISTORYした場合にもフラグが設定されることです。Intent

これがあなたの質問に答えることを願っています。

一般的なタスクの再親化の非常に詳細な説明については、この回答を参照してください。FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

于 2015-12-23T17:00:47.983 に答える
0

標準モードに設定されたアクティビティの動作は、新しいアクティビティが常に作成され、送信された各インテントで個別に動作します。メールを作成するために 10 個のインテントが送信された場合、各インテントを個別に提供するために 10 個のアクティビティを起動する必要があると想像してください。その結果、デバイスで起動されるこの種のアクティビティが無制限に存在する可能性があります。

Lollipop より前の Android での動作

標準のアクティビティが作成され、インテントを送信したタスクと同じタスクでスタックの一番上に配置されます。たとえば、ギャラリーから標準のアクティビティに画像を共有すると、別のアプリケーションからのものですが、説明したように同じタスクにスタックされます。アプリケーションを別のアプリケーションに切り替えてから Gallery に戻しても、Gallery のタスクの上に標準の launchMode が配置されていることがわかります。その結果、Gallery で何かを行う必要がある場合は、最初に追加の Activity で作業を完了する必要があります。

ここに画像の説明を入力

Android Lollipop での動作

アクティビティが同じアプリケーションからのものである場合、Lollipop 以前と同じように機能し、タスクの上に積み上げられます。ただし、インテントが別のアプリケーションから送信された場合。新しいタスクが作成され、新しく作成されたアクティビティが以下のようにルート アクティビティとして配置されます。

ここに画像の説明を入力

ソースはこちらから

于 2015-12-23T11:48:00.810 に答える