Android 启动模式老生常谈,这篇简单从概念介绍、TaskAffinity以及应用场景三方面讲一下。
概念介绍
Android 主要有四种启动模式,Standard
、SingleTop
、SingleTask
、SingleInstance
。
-
Standard
标准模式。在不指定启动模式的前提下,系统默认使用该模式启动Activity,每次启动一个Activity都会重写创建一个新的实例;
-
SingleTop
栈顶复用。这个模式下,如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时它的onNewIntent 方法会被调用。如果栈内有实例但不在栈顶或者栈内无实例,则情况与standard模式相同;
-
SingleTask
栈内复用。如果 Activity 已经存在于当前的任务栈中,无论是否处于栈顶,都会进行复用,在其上的其他实例都会被出栈;
-
SingleInstance
单例模式。该模式具备 singleTask模式的所有特性,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例。
如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例,并且回调 onNewIntent 方法。
TaskAffinity
什么是 TaskAffinity 属性呢?可以简单的理解为任务相关性。
- 这个参数标识了一个Activity所需任务栈的名字,默认为应用的包名
- 可以在清单文件中使用
android:taskAffinity
为每个 Activity 覆盖默认值 - Task,翻译过来就是任务,指的是 Activity 的集合或者容器,也就是我们常说的任务栈,一般来说,具有相同的 TaskAffinity 的activity 属于同一个任务
- 为一个 activit y的 TaskAffinity 设置一个空字符串,表明这个 activity 不属于任何 task
<!-- 不指定 taskAffinity 就默认是包名-->
<activity android:name=".MainActivity"/>
<activity android:name=".SingleTopActivity"
android:launchMode="singleTop"
android:taskAffinity="com.test.singletop"/>
但是要注意的是,这个属性对于 standard 模式和 SingleTop 模式是没有作用的,即,即便是为对应的 Activity 指定 TaskAffinity,它们启动的时候还是会在原来的Task中启动而不是新建。这是因为该属性主要是配合 SingleTask 启动模式使用的。
TaskAffinity & SingleTask
我们之前说,SingleTask 模式下,如果栈中存在某个 Activity 的实例,那就会复用这个 Activity,不管它是否位于栈顶。在复用时,也会将它上面的 Activity 全部出栈,并且会回调该实例的 onNewIntent 方法。
实际上,这个过程中还存在一个任务栈的匹配:这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过 taskAffinity 属性指定,默认为包名;如果这个任务栈不存在,则会创建这个任务栈。
完整的 SingleTask 工作流程如下:
- 根据 taskAffinity 去寻找当前是否存在一个对应名字的任务栈,默认包名
- 默认为包名,肯定存在对应的任务栈,查找有没有对应的 Activity 实例
- 有,出栈在它上面的所有 Activity,回调 onNewIntent
- 没有,创建一个新的 Activity 实例并将其入栈,之后的 Activity 都会使用这个新的任务栈
- 手动指定的 TaskAffinity,不存在对应名称的任务栈
- 创建一个新的 Activity 实例并将其入栈
- 默认为包名,肯定存在对应的任务栈,查找有没有对应的 Activity 实例
除此之外,还可以将两个不同 App 中的 Activity 设置为相同的 taskAffinity,这样虽然在不同的应用中,但是 Activity 会被分配到同一个 Task 中去。
应用场景
-
Standard
比如在社交应用中,点击查看用户A信息->查看用户A粉丝->在粉丝中挑选查看用户B信息->查看用户B粉丝... 这种情况下一般我们需要保留用户操作 Activity 栈的页面所有执行顺序;
-
SingleTop
假设 App 用户在短时间内收到了几条推送消息,需要用户点击推送通知进入到某个详情页,将信息页设置为 SingleTop 模式就可以增强复用性;
-
SingleTask
一般用作应用的首页,例如浏览器主页,用户可能从多个应用启动浏览器,但主界面仅仅启动一次,其余情况都会走 onNewIntent,并且会清空主界面上面的其他页面;
-
SingleInstance
常应用于独立栈操作的应用,如闹钟的提醒页面,当你在 A 应用中看视频时,闹钟响了,你点击闹钟提醒通知后进入提醒详情页面,然后点击返回就再次回到 A 的视频页面,这样就不会过多干扰到用户先前的操作
网友评论