美文网首页
说说 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