Android 4 つの主要コンポーネント アクティビティ起動モード

1.標準標準モード

Activity (以降 Ac と表記) が開始されるたびに、インスタンスの存在の有無に関係なくインスタンスが作成されます。
一般的なマルチインスタンスの実装では、タスク スタックに複数のインスタンスを含めることができ、各インスタンスが異なるタスク スタックに属することもできます。
Ac を開始するのは誰ですか。新しい Ac は、それを開始した Ac のスタックで実行されます。

2.singleTop スタックトップの再利用

新しい Ac がすでにタスク スタックの最上位にある場合、再起動後に新しい Ac は作成されず、同時にonNewIntent() メソッドのコールバックがトリガーされます。このメソッドのパラメータは現在リクエストされているものを取り出すことができます。情報。

スタックの最上位にない場合は、新しいスタックを作成し、onCreate()、onStart() を呼び出します。

例: ABCD、スタック内に 4 つの Ac、A はスタックの一番下、D はスタックの一番上にあります。D を再度起動すると、起動モードは singleTop になり、スタックは ABCD のままになります。

起動モードが標準の場合、D が再構築され、スタックは ABCDD になります。

3.singleTask のスタック内再利用

Ac がスタックに存在する限り、再起動時に再作成されません。singleTop と同様に、onNewIntent() メソッドが呼び出されます
。必要なタスク スタックが S1 で、タスク スタック S1 が ADBC の場合、原則はスタック内での再利用、D はリビルドではない、スタックの一番上にカットして onNewIntent() を呼び出す、singleTask に clearTop 効果がある、D 上のすべての Ac がスタックからポップされ、最後に AD

4.singleInstance シングル インスタンス モード

拡張された singleTask には、singleTask モードのすべての機能が備わっています。もう 1 つの拡張機能は、このモードの Ac は 1 つのタスク スタックにのみ配置できることです。この Ac によって開始された他の Ac は、他のタスク スタックに配置されます。

起動モードを指定します。

1. AndroidManifest経由でActivityに指定する

例えば:

<アクティビティ

android:name=“com.xxx.MyActivity”

android:launchMode=“singleTask”/>

2. インテントにフラグを設定してアクティビティを指定します

例えば:

インテントの意図 = new Intent();

インテント.setClass(MainActivity.this,MyActivity.class);

テント.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent)
注: 方法 2 の方が優先されます。

他の 2 つの方法は、次のような限られた範囲で異なります。

最初のメソッドはアクティビティの FLAG_ACTIVITY_CLEAR_TOP フラグを直接設定できません。また、2 番目のメソッドはアクティビティの singleInstance モードを指定できません。

アクティビティでよく使用されるフラグ:

1.FLAG_ACTIVITY_NEW_TASK:

シングルタスク起動モードを指定します。その効果は XML で指定したものと同じです。

成し遂げる:

起動 Ac タスクの taskAffinity (taskAffinity) を持つタスク スタックがあるかどうかを確認します。
同じ APP の Ac タスク相関関係は同じで、デフォルトはパッケージ名です。はい
、スタック全体をフォアグラウンドに移動します。スタック内の 1 つは変更されず、Ac を起動してスタックにプッシュし
、ストレージ用に新しいスタックを作成します
。 注: Ac が ApplicationContext で起動される場合は、FLAG_ACTIVITY_NEW_TASK を追加する必要があります。追加しない場合は、例外が報告されます。

2.FLAG_ACTIVITY_SINGLE_TOP:

XML仕様と同じsingleTop起動モードを指定します。

3.FLAG_ACTIVITY_CLEAR_TOP:

このマークの付いた Ac が開始されると、同じスタック内でその上の Ac がスタックから飛び出します。

このモードは通常、FLAG_ACTIVITY_NEW_TASK と組み合わせて使用​​する必要があり、このとき、アクティブ化された Ac が存在する場合、その onNewIntent() が呼び出されます。

開始された Ac が標準モードで開始された場合、その Ac と上記の Ac はスタックからポップされ、システムは新しい Ac インスタンスを作成してスタックにプッシュします。

4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:

このマークが付いたACは履歴AC一覧に表示されないため、履歴一覧から現在のACに戻らせたくない場合に使用できます。

XML で指定された Ac の Android 属性: excludeFromRecents="true"

5.FLAG_ACTIVITY_REORDER_TO_FRONT

スタック内で ABCD、B を開始、ACDB になる

タスクスタック

パラメータTaskAffinity (タスク アフィニティ) は、Ac が必要とするタスク スタックの名前を識別します。

デフォルトでは、Ac が必要とするすべてのタスク スタックの名前はアプリケーション パッケージ名です。

TaskAffinity 属性は主に、singleTask 起動モードまたはallowTaskReparenting 属性と組み合わせて使用​​され、その他の場合には意味がありません。

また、タスクスタックはフォアグラウンドタスクスタックとバックグラウンドタスクスタックに分かれており、バックグラウンドタスクスタックのAcは一時停止状態となっている。ユーザーはバックグラウンド タスク スタックを再びフォアグラウンドに戻すことができます

シーン:

TaskAffinity は、singleTask 起動モードと組み合わせて使用​​されます。これは、このモードでの Ac の現在のタスク スタックの名前です。起動される Ac は、TaskAffinity と同じ名前のタスク スタックで実行されます。TaskAffinity とallowTaskReparenting の場合、例えば、AとBの2つを適用した場合、AはBのAc Cを起動し、HOMEキーを押してデスクトップに戻り、その後Bのアプリをクリックします

起動するのはBのメインアプリではなく、Ac Cです。なぜならこのときCはAのタスクスタックからBのタスクスタックに転送されるからです。

原理: B が起動すると、B は独自のタスク スタックを作成しますが、このときシステムは C が作成されたことを認識し、A のタスク スタックから C を転送します。

おすすめ

転載: blog.csdn.net/qq_32670947/article/details/132490504