Activityの起動モードとIntent.FLAG_ACTIVITY_NEW_TASK理解


なぜモードを起動する必要があるのですか?通常のデフォルトでは、複数のActivityを起動すると、これらのActivityのインスタンスがそれぞれ作成され、タスクスタックに順番に押し込まれ、最後にスタックに入ったActivityがスタックの上部に表示されます.backキーをクリックすると、Activityは後進先出原則に従ってスタックを順次出て、スタックが空になるまでデスクトップに表示されます.しかし、千変万化のニーズの中で、このデフォルトのルールは私たちの開発を満たすことができず、Androidは他のいくつかのActivityの起動モードを提供しました.起動モードとは?起動モードは、実はAndroidがActivityにどのようなルールで順番を並べて表示させるかを定義します.Androidは4つの起動モード、すなわちstandard、singleTop、singleTask、singleInstanceを提供しています.次に、これらのモードの意味を紹介します.1、standard:標準モードであり、システムのデフォルトの起動モードでもあります.Activityを起動するたびに、インスタンスが既に存在するかどうかにかかわらず、新しいインスタンスが再作成されます.作成されたインスタンスは、通常のActivityで作成されたライフサイクルに合致します.また、新しく作成されたActivityは、そのActivityを作成するタスクスタックにデフォルトで属します.例えばAがBを作成すると、BはAが属するタスクスタックに押し込まれる.アプリケーションContextでStandardモードのActivityを起動すると、エラーが表示されます.これは,Activity以外のContextにはタスクスタックが存在しないためである.この問題を解決するには、起動するActivityのFLAG_を設定します.ACTIVITY_NEW_TASKタグビットは、Activityの新しいタスクスタックを作成します.2、singleTop:スタックトップ多重モード.このモードで起動します.Activityがスタックの上部にある場合、新しいインスタンスは作成されません.つまり、Activityのoncreateメソッド、onStartメソッドは呼び出されませんが、onNewIntentメソッドは呼び出されます.Activityがスタックトップにいない場合は、新しいインスタンスが作成され、スタックトップに押し込まれます.たとえば、スタックにはABCDの4つのActivityがあり、Dはスタックの上部にあり、Dを起動するとDは再作成されず、スタックにはABCDが残っています.Bを起動すると、Bが作成され、スタック内のActivityの順序がABCDBになります.3、singleTask:スタック内多重モード.このモードで起動したActivityは、1つのスタックに1つのインスタンスしか存在しません.このモードで起動したActivity Aは、まず一致するタスクスタックが存在するかどうかを探し(すなわち、タスクの相関が同じで、後述する)、存在しない場合は新しいタスクスタックを作成し、同時にAをスタックに入れる.一致するタスクスタックが存在する場合、スタックにAのインスタンスが存在するかどうかを検索し、存在する場合、A以前のタスクはスタックから消去され、Aをスタックトップに表示し、onNewIntentメソッドを呼び出す.Aが存在しない場合、Aのインスタンスが作成されます.たとえば、スタックにABCDの4つのActivityがあり、Dはスタックの上部にあり、singleTaskモードでBを起動すると、Bの前にスタックが出て、スタックのActivityはABになります.4、singleInstance:シングルインスタンスモード.これは強化されたsingleTaskであり、このモードを持つActivityに強化され、新しいタスクスタックに単独でしか存在しない.その後、Activityはスタックに単独で存在し、後続の要求はシステム全体がグローバルである限り、Activityの新しいインスタンスを作成しない.一般的なアプリケーションでは、スマートテレビのLauncherのようなActivityのように、どのアプリケーションもLauncherに切り替えて、いくつかの操作をして、キーを返して前のアプリケーションに戻ることができます.
Activityのタスクスタックとは?私たちは何度もタスクスタックというものに言及して、タスクスタックを理解して、まず1つのパラメータを知っています:TaskAffinity、タスクの相関性と呼ぶことができます.このパラメータは、Activityタスクスタックの名前を識別します.デフォルトでは、すべてのActivityタスクスタックの名前はアプリケーションのパッケージ名です.しかし、私たちは自分でこのTaskAffinityパラメータを設定して、パッケージ名とは異なる名前を取って、singleTask起動モードを相殺して、新しいスタックを作成することができます.TaskAffinityはsingleTask起動モードと同時にのみ使用できます.また、タスクスタックはフロントタスクスタックとバックグラウンドタスクスタックに分けられ、バックグラウンドタスクスタックのActivityは一時停止状態にあり、ユーザーは切り替えてバックグラウンドタスクスタックをフロントタスクスタックに変換することができる.親測により、バックグラウンドタスクスタックは複数あり、アプリケーションを開いてhomeキーを直接押すと、このアプリケーションのタスクスタックはバックグラウンドタスクスタックとして保存されることが分かった.
もう1つの例を実行します.3つのActivity:MainActivity、SecondActivity、ThirdActivityがあり、それぞれA、B、Cと命名されています.ここで、BとCはsingleTaskモードであり、taskAffinityプロパティが設定されています.
 
            
                

                
            
        
        
        
            
        
        
        
            
        

私たちはまずAを起動して、それからAの中でBを起動して、Bの中でCを起動して、Cの中でAを起動して、それからAの中でBを起動して、backボタンをクリックして発見して、Aが現れて、backボタンをクリックして、デスクトップを退出します.**私たちは次のプロセスを分析します:**まず通常Aを起動し、タスクスタックtask 0を作成します.次にsingleTaskモードでBを起動し、タスクスタックtask 1を作成する.Cを作成し、スタックtask 1に入る.StandardモードはAを作成し、スタックtask 1に入り、現在タスクスタックtask 1はBCA、タスクスタックtask 0はAである.singleTaskはBを作成し、CとAはスタックtask 1を出なければならない.task 1のActicityはBである.backキーを押すと、task 1のBがスタックを出た後、task 1は空になって破棄され、このときバックグラウンドタスクスタックtask 0をスケジューリングし、task 0のAを表示するしかない.backキーを押すとtask 0が空になり、最後にデスクトップがあるタスクスタックをスケジューリングし、launcherデスクトップを表示するしかありません.これで、タスク全体のスケジューリングが完了し、タスクスタックと特殊な起動方法についても一定の理解が得られました.
ここでは、JAVAコードでActivityを起動する際に使用する起動モードについても説明します.
Intent.FLAG_ACTIVITY_NEW_TASK:まず、起動されたActivityと同じタスク関連性を持つタスクスタック(taskAffinity、同じアプリケーションのactivityのタスク関連性に注意)が存在するかどうかを検索し、ある場合は、このスタック全体を直接フロントに移動し、スタック内の状態が変わらない、すなわちスタック内のactivity順序が変わらないことを維持します.存在しない場合は、起動されたactivityを格納するスタックを新規に作成します.デフォルトでは、同じアプリケーションのすべてのActivityは同じ相関を持っています(taskAffinity).ここでは、もともとタスクスタックが存在し、activityがすでにスタックに存在する場合を強調する.1、同じアプリケーションまたは同じタスクスタック内のstartActivityであれば、NEW_が設定されていてもTASKプロパティは、このActivityも再作成され、スタックに押し込まれます.2、他のタスクスタックを開いているActivityの場合、スタック中がABCDの場合、NEW_が設定されているTASK属性の後、startActivityに行きます.スタックの中はABCDで、再作成されません.Bを開くと、この時、そのあるタスクスタックが直接フロントに表示され、この時はABCDで、しかもDのインタフェースが表示されます.
Intent.FLAG_ACTIVITY_SINGLE_TOP:この属性はsingleTopモードと同じです.
Intent.FLAG_ACTIVITY_CLEAR_TOP:同じtaskの上にあるすべてのActivityをスタックから消去し、スタックの上部に配置します.FLAGとACTIVITY_SINGLE_TOPを一緒に使うのはsingleTaskに相当します.