Activityの起動モード:SingleTask

7411 ワード

目次
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

手順:
  • MainActivityを起動します.
  • MainActivityでSecondActivity
  • を起動
  • SecondActivityでMainActivity
  • を起動
  • MainActivityでSecondActivity
  • を起動
    使用コマンド:「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.まとめ

  • 「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インスタンスはタスクのスタックの先端に位置する.
  • 4. Reference


    一部のコンテンツは、「singleTask」モードから新しいスタックに切り替えることを参照してください.