Activityの4つの起動モードを徹底的に理解する


前言


あんなに長く働いていたのにActivityには4種類の起動モードがあることしか知らなかったのですが、その原理がまだわからず、今日はこの4種類の起動モードと適用シーンをまとめてみました.

一、taskAffinityとは何ですか。


Androidアプリケーションを開発する際、Activityのタスク属性を構成することができます.つまり、このActivityが新しいタスクで起動するのか、既存のタスクで起動するのか、または他のActivityがこのActivityと同じタスクを共有できるかどうかをシステムに伝えることができます.この不思議な属性はtaskAffinityです.
その使用方法は、1つのプロジェクトでActivityがtaskAffinityを指定していない場合、デフォルトではApplicationのtaskAffinityを使用し、Applicationも明記していない場合、デフォルトではtaskAffinityとしてパッケージ名を使用します.
<activity android:name=".SecondActivity"
 android:launchMode="singleTask"
 android:taskAffinity="com.song.demo"/>

二、Activityの4種類の起動モード


Standard起動モード


これはActivityのデフォルトの起動モードで、毎回タスクスタックのスタックの上部で新しいactivityインスタンスが起動します.

singleTop起動モード


スタックトップ多重化、すなわちsingleTopモードのActivityを起動するには、現在のスタックトップにある場合、直接多重化し、onNewIntentメソッドを実行します.そうでない場合は、インスタンススタックを再作成します.

singleTask起動モード


「singleTask」起動モードが設定されているActivityは、システムに1つのインスタンスしかありません.Activityを再起動すると、既存のタスクとインスタンスが再利用され、このインスタンスのonNewIntent()メソッドが呼び出され、Intentインスタンスがインスタンスに渡されます.「singleTask」起動モードが設定されているActivityの特徴(ポイント):起動時に、システム(既存のtasksすべて)で属性値affinityがその属性値taskAffinityに等しいタスクが存在するかどうかを検索します.
このようなタスクが存在する場合は、引き続きこのタスクに対応するActivityインスタンスが存在するかどうかを確認します.
インスタンスが存在する場合、このタスクとインスタンスが多重化され、finishはその上のactivityをすべて削除し、スタックの上部に配置し、onNewIntent()メソッドを実行します.インスタンスが存在しない場合は、このタスクスタックの上部にインスタンスを作成します.
このようなタスクが保存されていない場合は、taskAffinityで新しいタスクが作成され、タスクにインスタンスが作成されます.
したがって、「singleTask」起動モードのActivityを新しいタスクで起動するには、taskAffinityプロパティ値を個別に設定します.

singleInstance起動モード


常に新しいタスクで開始され、この新しいタスクにはこのインスタンスがあり、つまりインスタンスによって起動された他のActivityが自動的に別のタスクで実行されます.Activityのインスタンスを再起動すると、既存のタスクとインスタンスが再利用されます.このインスタンスのonNewIntent()メソッドが呼び出され、そのインスタンスにIntentインスタンスが渡されます.singleInstanceのActivityが設定されており、システム全体に1つのインスタンスしかなく、1つのスタックを独占し、それによって起動されたActivityはターゲットActivityのtaskAffinityに基づいてどのtaskを選択し、対応するtaskが存在しない場合はtaskを新規作成し、ターゲットActivityのインスタンスを新規作成してスタックに入る.

参考記事


1、Activityの4種類の起動モードアプリケーションシーン2、やっと分かったActivityの4種類の起動モード