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}
阅读全文
0 0
- LaunchMode and Flag
- launchMode和Flag
- android中的launchMode和flag
- Activity launchMode,taskAffinity,Intent.Flag
- 关于Activity的LaunchMode与Flag
- Android activity launchMode与Intent.Flag关系
- Activity launchmode和Intent flag详解
- android launchMode加载模式和intent flag
- Android LaunchMode and StartActivityForResult
- 有关launchMode和intent.flag的一些文章
- Activity LaunchMode,TaskAffinity,intent过滤规则及Flag资料整理
- Android Intent Flag、taskAffinity属性、launchMode等相关
- LaunchMode
- LaunchMode
- launchMode
- launchMode
- LaunchMode
- android深入解析Activity的launchMode启动模式,Intent Flag,taskAffinity
- ImageLoader
- 球场大佬【NOIP2017提高组A组模拟8.17】
- JQuery插件实现下拉复选框和后台mybatis接受处理数据
- Carbon Data 文件结构
- 码农不识贝叶斯,虽知数据也枉然
- LaunchMode and Flag
- [LintCode 514] 栅栏染色(Python)
- 远程访问SQL server
- 每天一点积累(一五)--类继承的加载
- Linux 的多线程编程的高效开发经验
- 类与对象和方法
- Android 反编译后修改 APK 中文件再进行打包签名(应用完整性校验)
- 股市总结
- 数字图像处理——灰度级、动态范围、对比度