LaunchMode and Flag

来源:互联网 发布:淘宝的支付方式有哪些 编辑:程序博客网 时间:2024/06/05 04:56

Activity LaunchMode and Intent Flags

通过执行adb shell dumpsys activity命令查看Task stack信息进行分析

LaunchMode

standard(默认模式)

  • 每次启动 Activity 都会创建 Activity 的新实例并添加到 Activity Task。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例。
  • 测试:
    MainActivity -> StandardActivity -> StandardActivity -> StandardActivity -> StandardActivity
Task id #2202      TaskRecord{db7d6c8 #2202 A=com.silion.androidproject U=0 sz=5}      Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }        Hist #4: ActivityRecord{cf2bd1c u0 com.silion.androidproject/.launchmode.StandardActivity t2202}          Intent { cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{90b97e9 26024:com.silion.androidproject/u0a155}        Hist #3: ActivityRecord{d8bea33 u0 com.silion.androidproject/.launchmode.StandardActivity t2202}          Intent { cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{90b97e9 26024:com.silion.androidproject/u0a155}        Hist #2: ActivityRecord{9b36f31 u0 com.silion.androidproject/.launchmode.StandardActivity t2202}          Intent { cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{90b97e9 26024:com.silion.androidproject/u0a155}        Hist #1: ActivityRecord{a3179f9 u0 com.silion.androidproject/.launchmode.StandardActivity t2202}          Intent { cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{90b97e9 26024:com.silion.androidproject/u0a155}        Hist #0: ActivityRecord{473e1ca u0 com.silion.androidproject/.MainActivity t2202}          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{90b97e9 26024:com.silion.androidproject/u0a155}

singleTop(栈顶复用模式)

  • 如果当前任务的顶部已存在 Activity 的一个实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建 Activity 的新实例
  • 测试:
    MainActivity -> StandardActivity -> SingleTopActivity-> StandardActivity -> SingleTopActivity -> SingleTopActivity
Task id #2206      TaskRecord{b306fe2 #2206 A=com.silion.androidproject U=0 sz=5}      Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }        Hist #4: ActivityRecord{7887ea5 u0 com.silion.androidproject/.launchmode.SingleTopActivity t2206}          Intent { cmp=com.silion.androidproject/.launchmode.SingleTopActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{558376a 11272:com.silion.androidproject/u0a155}        Hist #3: ActivityRecord{d6f5170 u0 com.silion.androidproject/.launchmode.StandardActivity t2206}          Intent { cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{558376a 11272:com.silion.androidproject/u0a155}        Hist #2: ActivityRecord{feb0117 u0 com.silion.androidproject/.launchmode.SingleTopActivity t2206}          Intent { cmp=com.silion.androidproject/.launchmode.SingleTopActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{558376a 11272:com.silion.androidproject/u0a155}        Hist #1: ActivityRecord{3ca8d1f u0 com.silion.androidproject/.launchmode.StandardActivity t2206}          Intent { cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{558376a 11272:com.silion.androidproject/u0a155}        Hist #0: ActivityRecord{24449c2 u0 com.silion.androidproject/.MainActivity t2206}          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} bnds=[17,58][187,278] }          ProcessRecord{558376a 11272:com.silion.androidproject/u0a155}

singleTask(栈内复用模式)

  • 如果不存在所需要的任务栈则新建一个任务栈(TaskAffinity)
  • 如果任务栈中该 Actiity 实例存在了,则清空任务栈该 Activity 上的其他Activity使该 Activity 在栈顶, 并调用它的 onNewIntent() 方法
  • 测试:
    MainActivity -> StandardActivity -> SingleTaskActivity-> StandardActivity -> SingleTopActivity -> SingleTaskActivity
Task id #2207      TaskRecord{f75526a #2207 A=com.silion.androidproject U=0 sz=3}      Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }        Hist #2: ActivityRecord{6d1b1c6 u0 com.silion.androidproject/.launchmode.SingleTaskActivity t2207}          Intent { flg=0x10000000 cmp=com.silion.androidproject/.launchmode.SingleTaskActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{36e5bbb 14650:com.silion.androidproject/u0a155}        Hist #1: ActivityRecord{a9a32ee u0 com.silion.androidproject/.launchmode.StandardActivity t2207}          Intent { cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{36e5bbb 14650:com.silion.androidproject/u0a155}        Hist #0: ActivityRecord{c24d7a7 u0 com.silion.androidproject/.MainActivity t2207}          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} bnds=[17,58][187,278] }          ProcessRecord{36e5bbb 14650:com.silion.androidproject/u0a155}

singleInstance(单例模式)

  • 单独位于一个任务栈, 而且该任务栈有且只有它一个实例
  • 测试:
    MainActivity -> StandardActivity -> SingleInstanceActivity-> StandardActivity -> SingleTopActivity -> SingleTaskActivity
Task id #2208      TaskRecord{e7c3df0 #2208 A=com.silion.androidproject U=0 sz=5}      Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }        Hist #4: ActivityRecord{34cece1 u0 com.silion.androidproject/.launchmode.SingleTaskActivity t2208}          Intent { flg=0x10000000 cmp=com.silion.androidproject/.launchmode.SingleTaskActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{d930215 19662:com.silion.androidproject/u0a155}        Hist #3: ActivityRecord{4a0532e u0 com.silion.androidproject/.launchmode.SingleTopActivity t2208}          Intent { cmp=com.silion.androidproject/.launchmode.SingleTopActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{d930215 19662:com.silion.androidproject/u0a155}        Hist #2: ActivityRecord{f90c571 u0 com.silion.androidproject/.launchmode.StandardActivity t2208}          Intent { flg=0x10400000 cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{d930215 19662:com.silion.androidproject/u0a155}        Hist #1: ActivityRecord{730382 u0 com.silion.androidproject/.launchmode.StandardActivity t2208}          Intent { cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{d930215 19662:com.silion.androidproject/u0a155}        Hist #0: ActivityRecord{efab721 u0 com.silion.androidproject/.MainActivity t2208}          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} bnds=[17,58][187,278] }          ProcessRecord{d930215 19662:com.silion.androidproject/u0a155}Task id #2209      TaskRecord{d65af69 #2209 A=com.silion.androidproject U=0 sz=1}      Intent { flg=0x10000000 cmp=com.silion.androidproject/.launchmode.SingleInstanceActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }        Hist #0: ActivityRecord{13980da u0 com.silion.androidproject/.launchmode.SingleInstanceActivity t2209}          Intent { flg=0x10000000 cmp=com.silion.androidproject/.launchmode.SingleInstanceActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{d930215 19662:com.silion.androidproject/u0a155}

Flag

FLAG_ACTIVITY_NEW_TASK

  • 这会产生与 “singleTask”launchMode 值相同的行为。(实际测试发现和singleTask不一样)
  • 测试:
    MainActivity -> StandardActivity -> FLAG_ACTIVITY_NEW_TASK -> SingleTopActivity -> SingleTaskActivity -> FLAG_ACTIVITY_NEW_TASK
Task id #2211      TaskRecord{d4e23f7 #2211 A=com.silion.androidproject U=0 sz=6}      Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }        Hist #5: ActivityRecord{caeadb1 u0 com.silion.androidproject/.launchmode.StandardActivity t2211}          Intent { flg=0x10000000 cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{54372d1 8990:com.silion.androidproject/u0a155}        Hist #4: ActivityRecord{c2ce16c u0 com.silion.androidproject/.launchmode.SingleTaskActivity t2211}          Intent { flg=0x10000000 cmp=com.silion.androidproject/.launchmode.SingleTaskActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{54372d1 8990:com.silion.androidproject/u0a155}        Hist #3: ActivityRecord{1c994c3 u0 com.silion.androidproject/.launchmode.SingleTopActivity t2211}          Intent { cmp=com.silion.androidproject/.launchmode.SingleTopActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{54372d1 8990:com.silion.androidproject/u0a155}        Hist #2: ActivityRecord{f72e3e6 u0 com.silion.androidproject/.launchmode.StandardActivity t2211}          Intent { flg=0x10000000 cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{54372d1 8990:com.silion.androidproject/u0a155}        Hist #1: ActivityRecord{69bc10e u0 com.silion.androidproject/.launchmode.StandardActivity t2211}          Intent { cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{54372d1 8990:com.silion.androidproject/u0a155}        Hist #0: ActivityRecord{1ec209d u0 com.silion.androidproject/.MainActivity t2211}          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} bnds=[17,58][187,278] }          ProcessRecord{54372d1 8990:com.silion.androidproject/u0a155}

FLAG_ACTIVITY_SINGLE_TOP

  • 这会产生与 “singleTop”launchMode 值相同的行为。
  • 测试:
    MainActivity -> StandardActivity -> FLAG_ACTIVITY_SINGLE_TOP -> SingleTopActivity -> FLAG_ACTIVITY_SINGLE_TOP -> FLAG_ACTIVITY_SINGLE_TOP
Task id #2213      TaskRecord{4d187b6 #2213 A=com.silion.androidproject U=0 sz=4}      Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }        Hist #3: ActivityRecord{5bd10 u0 com.silion.androidproject/.launchmode.StandardActivity t2213}          Intent { flg=0x20000000 cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{54372d1 8990:com.silion.androidproject/u0a155}        Hist #2: ActivityRecord{5c03537 u0 com.silion.androidproject/.launchmode.SingleTopActivity t2213}          Intent { cmp=com.silion.androidproject/.launchmode.SingleTopActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{54372d1 8990:com.silion.androidproject/u0a155}        Hist #1: ActivityRecord{749dd3f u0 com.silion.androidproject/.launchmode.StandardActivity t2213}          Intent { cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{54372d1 8990:com.silion.androidproject/u0a155}        Hist #0: ActivityRecord{54dc24f u0 com.silion.androidproject/.MainActivity t2213}          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} bnds=[17,58][187,278] }          ProcessRecord{54372d1 8990:com.silion.androidproject/u0a155}

FLAG_ACTIVITY_CLEAR_TOP

  • 如果正在启动的 Activity 已在当前任务中运行,则会销毁当前任务顶部的所有 Activity,并通过 onNewIntent() 将此 Intent 传递给 Activity 已恢复的实例(现在位于顶部),而不是启动该 Activity 的新实例。
  • 如果指定 Activity 的启动模式为 “standard”,则该 Activity 也会从堆栈中移除,并在其位置启动一个新实例,以便处理传入的 Intent。 这是因为当启动模式为 “standard” 时,将始终为新 Intent 创建新实例。
  • 测试:
    MainActivity -> StandardActivity -> FLAG_ACTIVITY_CLEAR_TOP -> SingleTopActivity -> SingleTaskActivity -> FLAG_ACTIVITY_CLEAR_TOP
Task id #2214      TaskRecord{5fbc873 #2214 A=com.silion.androidproject U=0 sz=2}      Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }        Hist #1: ActivityRecord{25f3e96 u0 com.silion.androidproject/.launchmode.StandardActivity t2214}          Intent { flg=0x4000000 cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{54372d1 8990:com.silion.androidproject/u0a155}        Hist #0: ActivityRecord{2f3af74 u0 com.silion.androidproject/.MainActivity t2214}          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} bnds=[17,58][187,278] }          ProcessRecord{54372d1 8990:com.silion.androidproject/u0a155}

FLAG_ACTIVITY_CLEAR_TASK

  • 测试:
    MainActivity -> StandardActivity -> SingleTopActivity -> SingleTaskActivity -> SingleInstanceActivity -> FLAG_ACTIVITY_CLEAR_TASK
Task id #2215      TaskRecord{bc4271a #2215 A=com.silion.androidproject U=0 sz=1}      Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.silion.androidproject/.MainActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }        Hist #0: ActivityRecord{1d045fe u0 com.silion.androidproject/.launchmode.StandardActivity t2215}          Intent { flg=0x10408000 cmp=com.silion.androidproject/.launchmode.StandardActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{668a033 31874:com.silion.androidproject/u0a155}    Task id #2216      TaskRecord{e8ac24b #2216 A=com.silion.androidproject U=0 sz=1}      Intent { flg=0x10000000 cmp=com.silion.androidproject/.launchmode.SingleInstanceActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }        Hist #0: ActivityRecord{5923413 u0 com.silion.androidproject/.launchmode.SingleInstanceActivity t2216}          Intent { flg=0x10000000 cmp=com.silion.androidproject/.launchmode.SingleInstanceActivity VirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)} }          ProcessRecord{668a033 31874:com.silion.androidproject/u0a155}
原创粉丝点击