Activity启动模式详解

来源:互联网 发布:ssh网上订餐系统源码 编辑:程序博客网 时间:2024/05/16 10:24

Activity 的启动模式详解

Activity四种启动模式:

1.standard : activity默认的启动,也是activity的标准模式.通俗的讲,就是你每start气动一个activity都会创建一个activity的实例,并假如返回栈中,并且不管这个实例是否存在. 在这种模式下,一个任务栈可以有多个activity的实例,每一个activity的多个实例也可以处于不同的任务栈中.并且在这种模式下,谁启动了这个activity,那么这个activity就在谁的任务栈中.

2.singleTop : 栈顶复用模式.在这种模式下,如果新Activity 已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent()方法会被回调,通过这个回调我们可以取到当前请求的信息.同时,该Activity的onCreate,onStart也不会被回调,因为它并不是启动一个新的Activity.但是,新的activity已存在但不是位于栈顶,那么该activity还是会被创建.

3.singleTask : 栈内复用模式. 这是一种单实例模式.该模式的意义是只要该activity的实例在栈内存在,它就不会被重新创建,再次start也会调用它的onIntent()方法.该种模式下启动时,首先会寻找该Activity的任务栈是否存在,假如不存在,则先创建它所在的任务栈,在创建它的实例(不存在任务栈,也就不存在它的实例);假如存在任务栈,再查看该任务栈中是否有该Activity的实例,假如有,则让该Activity之上的activity全部出栈,使该activity位于栈顶;假如没有,则创建该activity,压入栈顶.

4.singleInatance : 单实例模式.这种一种加强型的singleTask模式,它除了具有singleTask的大多数特性外,还有比较特殊的地方,就是具有该种模式的activity只能单独位于一个栈中,在新的栈中又由于栈内复用原则,再次启动并不会创建新的activity实例.

几种需要注意的情况.

假设前台任务栈有A,B两个activity,后台任务栈有C,D两个activity,而且C,D的模式都为singleTask,那么此时要启动D,那么此时后台任务栈会被切换到前台,后退列表会变成ABCD,按返回键,会一 一退出这些activity.如下图所示:

这里写图片描述

此时的返回列表:

这里写图片描述

同样的情况,此时要启动C,那么情况又会怎么样,结果如图所示:

这里写图片描述

分析:因为C activity的启动模式为singleTask,而且C activity的任务栈已经存在,并且C activity的实例也已经存在,那么singleTask模式下的activity会具有clear_top的标识一样的功能,在C之上的activity会自动出栈,C 会位于栈顶的位置,这就是singleTask清除顶部activity特殊的地方.

如何指定activity的任务栈

activity的任务栈与一个TaskAffinity的属性有关,这个参数标示了一个activity所在任务栈的名字标识,默认情况下,名字标识为该应用程序的包名,我们可以单独指定activity的任务栈的名称.任务栈分为前台任务栈和后台任务栈,前台任务栈是指当前与用户进行交互的任务栈,后台任务栈的activity处于暂停状态,任务栈可以相互切换,用户可以切换后台任务栈变成前台任务栈.TaskAffinity 属性的值必须为字符串,并且其中必须包含包名中的”.”分隔符.

TaskAffinity和singleTask模式

如果指定具有singleTask模式的activity的TaskAffinity属性,那么该activity会运行在该指定的TaskAffinity的任务栈中.

如何指定activity的启动模式

1.在Manifest 中指定activity的启动模式

android:launchMode="singleTask"

2.在startActivity的时候手动指定

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

启动Activity时setFlags 和 addFlags的区别

setFlags 是重新设置flags,并会把之前设置的flag清楚掉.

addFlags 是新增加一个flag,之前设置不会被清楚.

并且,setFlags 可以通过设置 | 来设置多个flag.

manifest和代码设置flags 启动activity时的区别

  • 优先级上,代码添加flag 优先级高于manifest设置
  • 两种都存在时,以代码设置的flag为准
  • 第一种无法为activity指定 FLAG_ACTIVITY_CLEAR_TOP 标识
  • 第二种无法为activity指定singleInstance模式

activity的常用的flags的标记

  1. FLAG_ACTIVITY_NEW_TASK
    相当于设定activity的启动模式为singleTask模式.
  2. FLAG_ACTIVITY_SINGLE_TOP
    相当于设定activity的启动模式为singleTop模式.
  3. FLAG_ACTIVITY_CLEAR_TOP
    设置此模式后,在同一个任务栈中的它之上的activity都会出栈.
    注意: 此标记一般会与FLAG_ACTIVITY_NEW_TASK 配合使用,在这种标识下,activity如果被启动已经存在,那么会调用onIntent()方法;假如此activity设置为standard 模式,该activity在栈中已存在,那么它之上的activity会出栈,并且需要注意,它也会出栈,并会重新创建该activity并把它压入栈中.
  4. FLAG_ACTIVITY_NO_HISTORY
    此种标记下activity不会加入栈中,比如你启动它,但是任务栈不会存在该activity的实例.
  5. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    设置此标识的activity不会出现在历史的activity列表中,用户不能通过历史activity列表回到我们的activity.
0 0
原创粉丝点击