Android Note - Activity启动模式

任务栈


任务栈(ActivityTask)由framework层的ActivityServiceManager管理的一个栈,在默认情况下,一个Application只维护一个任务栈,并以包名命名。每次系统需要启动一个Activity,要先将Activity入栈,然后才开始进行Activity的生命周期

启动模式


在manifest中Activity标签下的"android:launchMode"属性中设置,分为四种:

Standard
Activity启动的默认模式,使用该模式启动Activity时,系统并不会考虑之前是否会有相同的Activity进入任务栈;每次入栈都会创建新的Activity实例,不管栈中是否有相同Activity存在

任务栈 添加 Activity A 添加Activity A 添加Activity A
栈顶 Activity A
Activity A Activity A
栈底 Activity A Activity A Activity A

SingleTop
使用此模式时,系统向任务栈中加入Activity前,会先检查任务栈中栈顶是否为该Activity的实例,如果是的则直接使用该Activity,不是则创建新的实例并入栈

栈顶为要添加的Activity实例

任务栈 添加 Activity B 添加Activity A 添加Activity A
栈顶
Activity A Activity A
栈底 Activity B Activity B Activity B

栈顶不是要添加的Activity实例

任务栈 添加 Activity B 添加Activity A 添加Activity B
栈顶 Activity B
Activity A Activity A
栈底 Activity B Activity B Activity B

SingleTask
当栈顶为需要创建的Activity实例时,其表现形式与SingleTop模式相同;当栈顶不是需要创建的Activity时,则会检查任务栈中是否存在该Activity实例,如果存在,就将处于Activity上方的其他Activity都出栈,将该Activity置于栈顶

栈顶为要添加的Activity实例

任务栈 添加 Activity B 添加Activity A 添加Activity A
栈顶
Activity A Activity A
栈底 Activity B Activity B Activity B

栈顶不是要添加的Activity实例

任务栈 添加 Activity B 添加Activity A 添加Activity B
栈顶
Activity A
栈底 Activity B Activity B Activity B

SingleInstance
使用此模式时,系统会为使用该模式的Activity创建一个新的任务栈并将该Activity入栈,并且该任务栈中只能存在该Activity。也就是说如果有多个Activity使用了该模式,那么系统会为每一个使用该模式创建的Activity创建一个任务栈

其中Activity C为使用SingleInstance模式启动的Acitivity

默认任务栈 添加 Activity A 添加Activity C 添加Activity B 点击Back按钮 点击Back按钮 点击Back按钮
栈顶
Activity B
栈底 Activity A Activity A Activity A Activity A
SingleInstance任务栈 Activity C Activity C Activity C Activity C

应用场景


  • Standard 默认启动模式
  • SingleTop 适合接受通知的页面,如新闻客户端,如果好几条通知都是同一条新闻,那么每次点击通知跳转到应用时都调用同一张页面即可
  • SingleTask 适合作为应用的主页面,例如浏览器,当应用需要退出时,只要跳转到主页面,并finish主页面即可关闭全部打开的网页Activity
  • SingleInstance 适合作为共享页面,例如QQ或微信的第三方登录页面

参考资料


Android应用程序的Activity启动过程
Android入门:Activity四种启动模式


你可能感兴趣的:(Android Note - Activity启动模式)