Android的任务栈和启动模式的那点事情

   Android的启动模式

     先说说Android的启动模式,大家都不陌生,启动模式是在Android的manifest配置文件当中定义的,可以根据需要定义成以下4种不同的启动模式:

     standard

     standard模式,也是默认启动模式(如果mainifest文件中没有定义LaunchModel属性值,则默认为该启动模式),它的特征是每次调用startActivity都会启动一个实例,即可以同时存在多个实例;

    singleTop

    singleTop模式,也称栈顶模式,定义了该启动模式的Activity,在启动的时候会先检查调用栈栈顶的Activity实例是不是要启动的Activity实例,如果不是,则启动一个新的实例,如果是,则不会再重新实例化该Activity,但是会调用该Activity的onNewIntent方法;

    singleTask

    singleTask模式,定义该启动模式的Activity,在启动的时候会先检查现有栈中,有没有栈有它的实例,如果有,则把该实例移动到栈顶(位于该Activiy上部的Activity实例都将被移除),并把该栈移动到前台(注意如果这时,该栈中,除了顶部的目标Activity实例外,还有其它Activity实例在栈的底部,则按返回键,返回的就是栈底的Activity,而非返回启动目标Activity时的Activity);

    singleInstance

    singleInstance模式,即栈独占模式,定义该模式的Activity会独占一个栈,启动的时候,先检查所有栈,是否有该Activity实例,如果有,这把该栈移动到前台,如果没有,则新建一个栈,并在该栈中实例话该Activity,该模式下,Activity有且仅有一个实例;

 

   android的任务栈

    上述的Android启动模式,都有牵涉到一个知识,那就是任务栈,任务栈是什么?它类似于一个数组,管理着Activity的入栈和出栈的问题,一个任务栈中可以包含不同应用的Acitivity实例,一个应用的Activity实例可以分布在不同的任务栈中,activity最终要分配到哪个任务栈中,跟LaunchModel启动模式、taskAffinity属性、启动时附加Intent的Flag标识都有关系,下面具体说说taskAffinity及Intent的Flag标识

    taskAffinity

    说到taskAffinity属性,它可以定义在Manifest文件中的Activity标签中,它表明一种意向,即该Activity倾向于存在哪个任务栈中,该意向必须配合FLAG_ACTIVITY_NEW_TASK 或者singTask才会起作用,在配合FLAG_ACTIVITY_NEW_TASK 或者singTask时,效果都是一样的(并且不论是从哪个应用启动该Activity,具体的效果都是一样的),即启动该Activty时,会先检查该Activity的意向任务栈是否存在,如果不存在则创建,如果存在,则把该任务栈移动到前台,并清理该任务栈中该Activity之上的Activity。(注:如果不配合上述标志或者启动模式,taskAffinity属性不生效)

     这里还有一点需要指出,如果Actvity配置了singTask属性,同时设置了allowTaskReparenting属性为true,则跨应用打开的时候,会检查Activity所在应用栈是否已经创建,如果创建了直接把该应用栈移到前台并清理该应用之上的Activity实例,如果没有创建,则重新创建应用栈,并创建该Activity实例(下次桌面点击该应用图标时,直接把该应用栈移到前台,不会再重新创建应用栈)。

    Intent标志位

     还有一个对任务栈有影响的就是标志位了,下面说明对任务栈有影响的标志位:

     FLAG_ACTIVITY_SINGLE_TOP:跟Launch Mode中的singleTop效果一致

     FLAG_ACTIVITY_NEW_TASK:跟Launch Mode中的singTask效果一致

     FLAG_ACTIVITY_CLEAR_TOP:没有对应的Launch Mode模式,具体效果为,如果要启动的Activity存在于任务栈中,则清理该任务栈中该Activity之上的所有Activity实例。

     最后提到一点,如果Intent标识位跟Launch Mode有冲突,则以Intent标识位为准,实际应用当中可以根据实际需求动态调整Activity实例创建方式以及任务栈创建方式。

 

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值