Activityの起動モード:SingleTask
目次
1.概要
2.詳細手順
2.1 MainActivityの起動
2.1.1ライフサイクル
2.1.2 Activityスタック
2.2 MainActivityでSecondActivityを起動する
2.2.1ライフサイクル
2.2.2 Activityスタック
2.3 SecondActivityでMainActivityを起動する
2.3.1ライフサイクル
2.3.2 Activityスタック
2.4 MainActivityでSecondActivityを起動する
2.4.1ライフサイクル
2.4.2 Activityスタック
3.まとめ
4. Reference
Activityの4つの起動モードが常に表示されます.Standard、SingleTask、SingleTop、SingleInstanceです.公式ドキュメントで理解されています.しかし最近、Demoテストといういくつかの起動モードの特徴と違いを書いたところ、公式文書と一致しない点が見つかった.この記事では、SingleTaskというLaunchModeについて主に説明します.
Androidの公式ドキュメントでは、「singleTask」モードについて、The system creates a new task and instaniates the activity at the root of the new taskと説明しています.
しかしdemoテストを書いたとき、この言い方は正確ではないことに気づいた.この文が成立する条件は,起動するActivityのaffinityが唯一である,すなわち,現在のすべてのタスクにそのaffinityと同じタスクがないことである.
Demoには2つのActivity,ActivityのLaunchModeが含まれています.
手順: MainActivityを起動します. MainActivityでSecondActivity を起動 SecondActivityでMainActivity を起動 MainActivityでSecondActivity を起動
使用コマンド:「dumpsys activity activities」、dump Activityスタックの情報.
「singleTask」モードで起動したActivityは、起動時に、まずシステムで属性値affinityがその属性値taskAffinityに等しいタスクが存在するかどうかを検索します.存在する場合は、そのタスクで起動します.存在しない場合は、新しいタスクで開始されます.したがって、「singleTask」起動モードのActivityを新しいタスクで起動するには、独立したtaskAffinityの値を設定します.(この文のより具体的な例は、App 1でtaskAffinityがcom.xx.testのActivity Aが起動され、App 2でtaskAffinityがcom.xx.testのActivity Bが起動されると、Activity BはActivity Aが存在するタスクで起動されます). 「singleTask」起動モードのActivityが新しいタスクで起動されていない場合は、既存のタスクで対応するActivityインスタンスがすでに存在するかどうかを確認し、存在する場合はインスタンスのonNewIntentを呼び出し、このActivityインスタンスの上にあるActivityをすべて終了し、最終的にこのActivityインスタンスはタスクのスタックの先端に位置する.
一部のコンテンツは、「singleTask」モードから新しいスタックに切り替えることを参照してください.
1.概要
2.詳細手順
2.1 MainActivityの起動
2.1.1ライフサイクル
2.1.2 Activityスタック
2.2 MainActivityでSecondActivityを起動する
2.2.1ライフサイクル
2.2.2 Activityスタック
2.3 SecondActivityでMainActivityを起動する
2.3.1ライフサイクル
2.3.2 Activityスタック
2.4 MainActivityでSecondActivityを起動する
2.4.1ライフサイクル
2.4.2 Activityスタック
3.まとめ
4. Reference
1.概要
Activityの4つの起動モードが常に表示されます.Standard、SingleTask、SingleTop、SingleInstanceです.公式ドキュメントで理解されています.しかし最近、Demoテストといういくつかの起動モードの特徴と違いを書いたところ、公式文書と一致しない点が見つかった.この記事では、SingleTaskというLaunchModeについて主に説明します.
Androidの公式ドキュメントでは、「singleTask」モードについて、The system creates a new task and instaniates the activity at the root of the new taskと説明しています.
しかしdemoテストを書いたとき、この言い方は正確ではないことに気づいた.この文が成立する条件は,起動するActivityのaffinityが唯一である,すなわち,現在のすべてのタスクにそのaffinityと同じタスクがないことである.
Demoには2つのActivity,ActivityのLaunchModeが含まれています.
MainActivity-Standard
SecondActivity- SingleTask
手順:
使用コマンド:「dumpsys activity activities」、dump Activityスタックの情報.
2.詳細手順
2.1 MainActivityの起動
2.1.1ライフサイクル
2019-02-25 08:05:36.334 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onCreate:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 08:05:36.528 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStart:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 08:05:36.531 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onResume:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2.1.2 Activityスタック
TaskRecord{832ddac #32 A=com.maureen.testtwoactivity U=0 StackId=1 sz=1}
Run #0: ActivityRecord{2de94c6 u0 com.maureen.testtwoactivity/.MainActivity t32}
2.2 MainActivityでSecondActivityを起動する
2.2.1ライフサイクル
2019-02-25 08:06:22.582 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onPause:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 08:06:22.669 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onCreate:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:06:22.772 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onStart:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:06:22.776 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onResume:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:06:23.520 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStop:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 08:06:23.522 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onSaveInstanceState:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2.2.2 Activityスタック
TaskRecord{832ddac #32 A=com.maureen.testtwoactivity U=0 StackId=1 sz=2}
Run #1: ActivityRecord{8be2cd6 u0 com.maureen.testtwoactivity/.SecondActivity t32}
Run #0: ActivityRecord{2de94c6 u0 com.maureen.testtwoactivity/.MainActivity t32}
2.3 SecondActivityでMainActivityを起動する
2.3.1ライフサイクル
2019-02-25 08:07:46.098 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onPause:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:07:46.165 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onCreate:this=com.maureen.testtwoactivity.MainActivity@24103c8
2019-02-25 08:07:46.272 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStart:this=com.maureen.testtwoactivity.MainActivity@24103c8
2019-02-25 08:07:46.277 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onResume:this=com.maureen.testtwoactivity.MainActivity@24103c8
2019-02-25 08:07:47.006 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onStop:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:07:47.008 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onSaveInstanceState:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2.3.2 Activityスタック
TaskRecord{832ddac #32 A=com.maureen.testtwoactivity U=0 StackId=1 sz=3}
Run #2: ActivityRecord{3e6e847 u0 com.maureen.testtwoactivity/.MainActivity t32}
Run #1: ActivityRecord{8be2cd6 u0 com.maureen.testtwoactivity/.SecondActivity t32}
Run #0: ActivityRecord{2de94c6 u0 com.maureen.testtwoactivity/.MainActivity t32}
2.4 MainActivityでSecondActivityを起動する
2.4.1ライフサイクル
2019-02-25 08:08:51.142 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onPause:this=com.maureen.testtwoactivity.MainActivity@24103c8
2019-02-25 08:08:51.174 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onNewIntent:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:08:51.182 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onStart:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:08:51.185 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onResume:this=com.maureen.testtwoactivity.SecondActivity@d5d6a26
2019-02-25 08:08:51.898 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStop:this=com.maureen.testtwoactivity.MainActivity@24103c8
2019-02-25 08:08:51.902 3077-3077/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onDestroy:this=com.maureen.testtwoactivity.MainActivity@24103c8
2.4.2 Activityスタック
TaskRecord{8ea7a0a #2 A=com.android.car.carlauncher U=0 StackId=0 sz=1}
Run #0: ActivityRecord{d99cab7 u0 com.android.car.carlauncher/.CarLauncher t2}
3.まとめ
4. Reference
一部のコンテンツは、「singleTask」モードから新しいスタックに切り替えることを参照してください.