启动模式共有四种
Stand
Android 默认的启动模式,每次创建一个新的实例放入栈
Activity C 的启动模式为Stand,栈内已有A、B、C,在C内再次启动C,则会创建一个新的C实例放入栈顶。
SingleTask
栈内仅存一个实例
Activity A、C 的启动模式为SingleTask,当需要启动的Activity实例存在于栈内,则pop实例之上的其他实例出栈使其成为栈顶,并回调onNewIntent。
若Activity实例不存在于栈内,则创建新实例放入新栈。
SingleInstance
一个实例占一个栈
Activity D 的启动模式为SingleInstance,已经启动了ActivityA、ActivityB、ActivityC,由C启动D,则新创建的D实例会单独放一个栈。
由Activity D 启动的Activity E则会回到栈1
SingleTop
Activity A、C 的启动模式为SingleTop,当需要启动的Activity实例位于栈顶,则复用该实例并回调onNewIntent。若需要启动的Activity实例不位于栈顶则新建实例放入栈顶。
启动模式的设置
可以在manifest里设置也可以动态代码设置,intent.addFlags用处在此。若两种方式同时使用,则代码设置的优先级高。
manifest无法为Activity直接指定 FLAG_ACTIVITY_CLEAR_TOP 标识,动态代码方式无法为Activity指定 SingleInstance模式。
有个Flag有用但不常用
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
同
android:excludeFromRecents="true"
官方解释:设置后Activity将不会出现在最近任务。
实际操作:
- 在Activity时按任务键,会看到任务
- 先按home键再按任务键,看不到任务,重新打开APP会回到原来的Activity位置
- 一直按返回直到APP退出,按任务键不设置此属性会看到任务,设置后不会看到任务
有了此操作可以做些不为人知的动作