Androidのアクティビティの起動モードを理解する

共有は思いやり!

アクティビティの起動モードは、タスクとバックスタックを維持するために重要な役割を担っています。 起動モードについて説明する前に、まずタスクとバックスタックとは何かについて理解する必要があります。 アクティビティがバックグラウンドに送信されると (たとえば、アクティビティを表示しているときに HOME キーを押すなど)、タスク全体 (およびその中のすべてのアクティビティ) も送信し直されます。 その後、ユーザーがアプリケーションをクリックすると、タスク(とそのアクティビティの順序)が前に出てきます。 言い換えると、タスクは、ユーザーがある仕事をするときにやり取りするアクティビティの集合体です。 アクティビティは、各アクティビティが開かれた順番にスタック(バックスタック)に配置されます。

つまり、基本的にユーザーがホーム アイコンからアプリケーションを起動すると、異なる画面をナビゲートするので、異なるアクティビティが互いの上に配置されるのです。 アクティビティのこのコレクションは、タスクとして知られています。

Back Stack

アクティビティは、各アクティビティが開かれた順番に配置されます。 この維持されたスタックは、バックスタックと呼ばれます。

一度バックボタンを押すと、一番上のアクティビティを「ポップ」し、バックスタックから削除して、前のアクティビティに戻します。

  1. AndroidManifest.xml ファイルで宣言する
  2. Intent でフラグを追加する

Activity の起動モードには 4 種類があります。 7530>

  1. standard
  2. singleTop
  3. singleTask
  4. SingleInstance

Manifest file.File.File。

Exp:

<activity android:launchMode = ../>

Intent Flag: マニフェスト ファイルでアクティビティを宣言するとき、アクティビティが開始時にタスクとどのように関連付けるかを指定できます。 Androidにはアクティビティフラグも用意されており、startActivity()メソッドでアクティビティを起動する際に、タスクとの関連付けのデフォルト動作を変更することができます。 アクティビティ クラスの複数のインスタンスを作成でき、複数のインスタンスを同じタスクまたは異なるタスクに追加できます。

例:
A、B、C、および D のアクティビティがあり、アクティビティ B が「起動モード = 標準」であるとします。 今、あなたは再びアクティビティBを起動します –
State of Activity Stack before launch B
A -> B -> C -> D
State of Activity Stack after launch B
A -> B -> C -> D -> B

singleTopとなります。 標準との違いは、アクティビティのインスタンスが現在のタスクの先頭にすでに存在し、システムがこのアクティビティにインテントをルーティングする場合、新しいオブジェクトを作成するのではなく、メソッドonNewIntent()を起動するため、新しいインスタンスは作成されないということです。

例:
ケース 1:
A, B, C のアクティビティがあり、アクティビティ D には “launch mode = singleTop” があるとします。 アクティビティDを起動する。起動前のアクティビティスタックの状態 D
A -> B -> C
起動後のアクティビティスタックの状態 D activity
A -> B -> C -> D (where D launch as usual)
Case2:
A, B, C, Dアクティビティを持っていて、Dには「起動モード = singleTop」があると仮定する。 ここで、あなたは再びアクティビティDを起動します –
State of Activity Stack before launch D
A -> B -> C -> D
State of Activity Stack after launch D activity
A -> B -> C -> D(ここでは古いインスタンスは呼び出されてonNewIntent()コールバックを通してインテントデータルーティング)

singleTask : 新しいタスクは常に作成され、新しいインスタンスはルートとしてタスクにプッシュされます。 しかし、任意のタスクに任意のアクティビティインスタンスが存在する場合、システムはメソッドonNewIntent()の呼び出しを通じて、そのアクティビティインスタンスにインテントをルーティングする。 このモードでは、アクティビティインスタンスを同じタスクにプッシュすることができる。

例:
ケース 1:
A, B, C のアクティビティがあり、アクティビティ D が “launch mode = singleTask” であるとします。 ここでアクティビティDを起動する –
起動前のアクティビティスタックの状態 D
A -> B -> C
起動後のアクティビティスタックの状態 D activity
A -> B -> C -> D(ここでDは通常通り起動)
ケース2:
A、B、C、Dアクティビティを持ち、Bアクティビティが「起動モード= singleTask」だったと仮定する。 ここで、アクティビティBを再び起動します。
起動前のアクティビティスタックの状態 D
A -> B -> C -> D
起動後のアクティビティスタックの状態 B activity
A -> B(ここで古いインスタンスが呼び出されて、インテント データは onNewIntent() コールバックを通じてルートされます)
また、CとDのアクティビティはここで破壊されていることに注目します。

singleInstance : singleTaskと同じですが、singleInstanceと同じタスクには、アクティビティインスタンスは投入されません。 したがって、起動モードのアクティビティは、常に単一のアクティビティインスタンスタスクの中にある。

例:
ケース 1:
アクティビティ A、B、C があり、アクティビティ D が “launch mode = singleInstance” であったとします。 アクティビティDを起動します。
起動前のアクティビティスタックの状態 D
A -> B -> C
起動後のアクティビティスタックの状態 D activity
Task1-A -> B –
A -> B –
A -> C -Task2-D (ここでDは別のタスクになる)
ここで、これを続けてEとDを開始すると、スタックは次のようになります:
Task1-A -> B -> C -> E
Task2-D
ケース2。
あるタスクにA、B、Cのアクティビティがあり、アクティビティDが「起動モード = singleInstance」で別のタスクにあるとする。 ここで、アクティビティDを再び起動します。
起動前のアクティビティスタックの状態 D
Task1-A -> B -> C
Task2-D
起動後のアクティビティスタックの状態 B activity
Task1-A -> B -> C
Task2-D (Here old instance gets called and intent data route through onNewIntent() callback)

FLAG_ACTIVITY_NEW_TASK : マニフェスト ファイル内の値singleTaskと同じです (上記を参照)。

FLAG_ACTIVITY_SINGLE_TOP : マニフェスト ファイル内の値singleTop (上記参照) と同じ。

FLAG_ACTIVITY_CLEAR_TOP : 開始するアクティビティが現在のタスクですでに実行中の場合、そのアクティビティの新しいインスタンスを起動する代わりに、その上にある他のすべてのアクティビティを破棄して、アクティビティの再開したインスタンスにこの意図を配信しますが (現在トップ)、onNewIntent() この動作を生成するマニフェスト ファイル内に対応する値が存在しないためです。 私はこの記事のための参照を使用して、こことここです。

Please do subscribe email to get all newsletters of this blog and if you feel that this post will help you to better understand then do not forget to subscribe, share and comment below.このブログのすべてのニュースレターを取得するために電子メールを購読してください。 それでは、次回のチュートリアルでお会いしましょう!🙂

0 0 投票
記事評価

私は堅実なAndroidアプリケーションを構築するための非常に熱心なAndroid開発者である。 私はAndroidの開発に興味があり、Google Playストアにアプリを公開しています。 私は常に新しい技術を学ぶことにオープンです。 何かありましたら、いつでも [email protected]

までご連絡ください。