美文网首页
说说 LaunchMode ?

说说 LaunchMode ?

作者: Joseph_L | 来源:发表于2019-11-18 23:47 被阅读0次

Android 启动模式老生常谈,这篇简单从概念介绍、TaskAffinity以及应用场景三方面讲一下。

概念介绍

Android 主要有四种启动模式,StandardSingleTopSingleTaskSingleInstance

  1. Standard

    标准模式。在不指定启动模式的前提下,系统默认使用该模式启动Activity,每次启动一个Activity都会重写创建一个新的实例;

  2. SingleTop

    栈顶复用。这个模式下,如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时它的onNewIntent 方法会被调用。如果栈内有实例但不在栈顶或者栈内无实例,则情况与standard模式相同;

  3. SingleTask

    栈内复用。如果 Activity 已经存在于当前的任务栈中,无论是否处于栈顶,都会进行复用,在其上的其他实例都会被出栈;

  4. 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 实例并将其入栈

除此之外,还可以将两个不同 App 中的 Activity 设置为相同的 taskAffinity,这样虽然在不同的应用中,但是 Activity 会被分配到同一个 Task 中去。

应用场景
  • Standard

    比如在社交应用中,点击查看用户A信息->查看用户A粉丝->在粉丝中挑选查看用户B信息->查看用户B粉丝... 这种情况下一般我们需要保留用户操作 Activity 栈的页面所有执行顺序;

  • SingleTop

    假设 App 用户在短时间内收到了几条推送消息,需要用户点击推送通知进入到某个详情页,将信息页设置为 SingleTop 模式就可以增强复用性;

  • SingleTask

    一般用作应用的首页,例如浏览器主页,用户可能从多个应用启动浏览器,但主界面仅仅启动一次,其余情况都会走 onNewIntent,并且会清空主界面上面的其他页面;

  • SingleInstance

    常应用于独立栈操作的应用,如闹钟的提醒页面,当你在 A 应用中看视频时,闹钟响了,你点击闹钟提醒通知后进入提醒详情页面,然后点击返回就再次回到 A 的视频页面,这样就不会过多干扰到用户先前的操作

相关文章

网友评论

      本文标题:说说 LaunchMode ?

      本文链接:https://www.haomeiwen.com/subject/unpiictx.html