美文网首页
Activity的启动模式LaunchMode

Activity的启动模式LaunchMode

作者: 空山Echo | 来源:发表于2019-05-08 10:39 被阅读0次

任务栈

栈是一种常用的数据结构,栈只允许访问栈顶的元素。
任务栈分为前台任务栈后后台任务栈,每个Activity被一一放入任务栈。是一种“后进先出”的栈结构

Task

Task是与Activity相关的一个重要概念,它密切联系着Activity栈,它简单的说,就是一组以栈的模式聚集在一起的Activity组件集合。Activity在Task中的顺序是可以控制的,在Activity跳转时用到Intent Flag可以设置新建activity的创建方式。

启动模式

四种启动模式:standard、singleTop、singleTask、singleInstance

  • standard:标准模式

是默认的启动模式,每次启动一个Activity都会创建一个实例。典型的多实例实现,一个任务栈可以有多个实例,不同实例可以属于不同任务栈。

比如ActivityA启动了ActivityB,那么B就进入到A所在的任务栈

  • singleTop:栈顶复用模式

如果Activity已经位于栈顶,这时候启动它,不会新建实例,同时onNewIntent被回调,通过此方法可以取出当前请求的信息。如果不是位于栈顶,则Activity还是被重建

  • singleTask:栈内复用模式

只要当前栈中存在该Activity实例,那么多次启动也不会重建,同时onNewIntent被回调

比如具有singleTask模式的ActivityA请求启动时候

  1. 系统先寻找是否存在有A想要的任务栈,没有则新建任务栈并将A放入
  2. 如果已经存在A所需的任务栈,则看是否已经存在A实例
    如果实例存在,那么系统就会将A调到栈顶并调用它的onNewIntent方法,同时singleTask默认具有clearTop的效果,会将栈内A上面的Activity全部出栈
    没有则新建A并压入栈中。
  • singleInstance:单实例模式

除了具有singleTask所有特性外,具有此模式的Activity只能单独位于一个任务栈,所有Activity栈中只有存在一个实例

ActivityA启动ActivityB(SingleInstance模式):
该模式不区分ActivityA与ActivityB是否位于同一个应用
所有任务栈中不存在ActivityB,则ActivityB会在新的任务栈中创建,并且该任务栈始终只有ActivityB,ActivityB启动其他Activity会被放到另外的任务栈
某个任务栈中存在ActivityB,则直接利用。

什么是Activity所需的任务栈?

参数TaskAffinity

任务相关性,标识了Activity所需的任务栈名字,默认为包名,为空时候不属于任何任务栈

使用TaskAffinity

  • 与singleTask模式配对使用
 android:taskAffinity="不同于包名的属性"
 android:launchMode="singleTask"
  • 与allowTaskReparenting属性配对使用
android:taskAffinity="不同于包名的属性"
android:allowTaskReparenting="true"

如何指定启动模式

  • Menifest中声明android:launchMode
<activity 
    android:name=".MainActivity"
    android:launchMode="singleTask"
 />   
  • Intent中设置addFlags(优先级更高)
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Activity的Flags

标记位有的设定Activity启动模式,有的影响Activity运行状态

  • Intent.FLAG_ACTIVITY_NEW_TASK (默认)
    同singleTask
  • FLAG_ACTIVITY_SINGLE_TOP
    同singleTop
  • FLAG_ACTIVITY_CLEAR_TOP
    当被启动的ActivityA实例已经存在,如果和singleTask启动模式一起出现,则调用它的onNewIntent并清除A上面的所有实例;如果被启动的Activity采用standard模式,那么它连同它之上的都出栈,系统创建新的实例放入栈中
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    标记的Activity不会出现在历史列表中,等同于Menifest中指定android:excludeFromRecents="true"
  • ...

清晰描述onNewIntent调用的场景

在singleTop、singleTask、singleInstance下....

相关文章

网友评论

      本文标题:Activity的启动模式LaunchMode

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