Android的启动模式:singleTask与singleTop的使用

前言

singleTopsingleTaskActivity最常用的两种启动模式。本文主要讲解两者之间的区别与使用场景。

推荐

个人博客:李益的小站

Activity的四种启动模式

Activity共有四种启动模式,我们先简单回顾一下,如想要详细了解的,可自行网上查询(相关文章很多哦,本文就不再详细赘述)了。

  • standard

    标准模式,也是Activity的默认启动模式,允许存在多个Activity实例,每次启动页面时都会生成一个新的Activity实例。

  • singleTop

    相比于standard,有新的页面启动请求时,当目标Activity处于当前栈顶时,会调用ActivityonNewIntent()方法,但不创建新实例;其他情况都和standard一致。

  • singleTask

    设置了singleTask为启动模式的Activity,它在启动的时候,会先在系统中查找是否存在属性值affinity等于它自己的属性值taskAffinity的任务栈存在;如果存在这样的任务栈,它就会在这个任务栈中启动,否则就会在新任务栈中启动。因此,如果我们想要设置了启动模式为singleTaskActivity在新的任务栈中启动,就要为它设置一个独立的taskAffinity属性值。如果设置启动模式为singleTaskActivity不是在新的任务栈中启动,它会在已有的任务栈中查看是否已经存在相应的Activity实例,如果存在,就会把位于这个Activity实例上面的其他Activity全部结束掉,最终这个Activity实例会位于任务栈的顶端。

  • singleInstance

    singleTask相比,不同点在于singleInstance activity所在的任务栈只会有这一个Activity

Activity的任务栈(Task)简述

  • Application启动时,系统会为Application创建一个任务栈(Task)
  • 我们对Activity的打开和关闭操作,就是将Activity压入(push)任务栈和从任务栈中弹出(pop)的操作
  • 任务栈遵循先进后出的原则,在栈顶的Activity就是设备当前显示的Activity
  • singleTasksingleTop一般都是为了保证Activity在任务栈中的唯一性

singleTop的使用

使用singleTop模式的Activity在栈顶时只会在Task中存在一个实例,所以可以在以下场景中使用:

  • 要打开的Activity处于栈顶,点击通知栏打开栈顶的Activity
  • Activity需要启动一个Service,最后Service对栈顶Activity进行操作
  • 特定情况时,如进行数据刷新,自己跳转自己,走onNewIntent()刷新数据
  • 等等......

总之,singleTop比较适用于ChildActivity(非主架构Activity)

singleTask的使用

  • Task中存在Activity实例,不会创建Activity,而是销毁Activity上面所有其他的Activity,以此来使将要跳转的Activity处于栈顶显示;如果不存在,则在栈顶创建一个Activity实例,所以假如有人问如何快速关闭100个Activity,只要给跳转的Activity设置singleTask即可
  • Activity单独使用singleTask,并不会创建一个新的Task
  • singleTaskActivity如果设置了独立的taskAffinity属性值,启动时就会在新的Task中,否则会在已有Task

所以基于以上特性,比较适合主架构Activity(例MainActivity)设置为singleTask,或者一些经常使用,但是关闭和跳转不规律的Activity

你可能感兴趣的:(Android的启动模式:singleTask与singleTop的使用)