背景
在 Android 开发中,遇到一个场景 Bug。
- 在回调事件中启动另外一个 Activity 过程中,存在点击速度太快(即在页面未转跳之前,双击甚至多次快速点击)会多次启动该 Activity ,启动后点击返回按钮需要多次返回,具体场景看动图。
翻阅大量资料后,在官方文档发现在 AndroidMainfest 的 Activity 标签下有一个名为 android:launchMode 的属性(详细见下图)。
LaunchMode (启动模式)
官方文档解析如下:
android:launchMode 是有关如何启动 Activity 的指令。共有四种模式与 Intent 对象中的 Activity 标志(FLAG_ACTIVITY_*常量)
作用
Activity的启动模式的应用的设置是和它的开发场景有关系的,在App中打开新的Activity的基本上分为两种情况:
- 目标Activity是本应用中的Activity,即它的启动模式是可以直接在fanifest中配置或者默认为standard,任务栈也可以自己随意设置;
- 目标Activity是第三方App中的Activity,这个时候就需要先考虑打开新Activity的是和自己App放在同一任务栈中还是新的task中,然后考虑Activity的启动模式; 所以Android提供了优先级更高的设置方式在Intent.setFlags(int flags),通过这setFlags就可以为打开第三方的App中Activity设置任务栈和启动模式了,具体设置就自己去看源码了。
应用场景
详细看表格:
LaunchMode | 场景 |
---|---|
standard | 邮件、默认场景 |
SingleTop | 登录界面、WXPlayEntryActivity、WXEntryActivity、推送通知栏 |
SingleTask | 程序模块逻辑入口:(Fragment 的 ContainerActivity)、WebView 页面、扫一扫页面;电商APP:购物页面、确认订单页面、付款页面 |
SingleInstance | 系统 Launcher、锁屏键、来电显示等系统应用 |