android-----Activity启动模式

     当应用程序运行起来之后,android系统会开启一个线程,这个线程主要用途就是为了维护应用程序在运行过程中的Activity栈,每当创建一个Activity之后都会将该Activity压入到栈中,Activity的启动模式是指当栈中已经存在该Activity实例的情况下该怎么处理,不同的模式处理方式是不同的,因而我们有必要来探讨下Activity的启动模式。

      Activity的启动模式在Mainfest.xml里Activity标签下的android:launchMode属性设置的,共有四种方式,我们一一来介绍;


模式1:standard(默认)


解释:只要创建并且激活了Activity,则就会将该Activity加入到栈中,而不管该栈中是否已经存在该实例,退出Activity时候,将该Activity从栈中销毁,这种方式不会创建新的Task,而是将Activity加入到原来的Task中;


模式2:SingleTop


解释:该模式会先考虑所要激活的Activity在不在当前栈中的栈顶位置,如果在的话,直接从该栈顶拿出该实例就可以了,而并不会创建新的Activity实例,如果不存在的话,就创建并且激活新的实例,并将其置于栈顶,这种方式也不会创建新的Task出来;


模式3:SingleTask(Task内单例模式)


解释:该模式会先查看所要激活的Activity在当前栈中是否存在实例,而不仅仅是考虑栈顶位置是否存在,分为三种情况:

(1)如果存在,且该实例不是位于栈顶,则将该实例以上的全部实例全部出栈以使得让该实例位于栈顶,调用该实例的newInstance方法得到该实例,而不会创建新的实例出来;

(2)如果存在,且该实例位于栈顶,则直接使用该实例即可,这点有点类似于SingleTop模式;

(3)如果在当前栈中不存在所要激活的实例,则会创建并且激活新的实例,而后将其置于栈顶;


模式4:SingleInstance(全局单例模式)


解释:该模式下无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例,并且用全新的Task来存放该Activity实例,分为两种情况:

(1)如果要创建的Activity不存在,则系统会首先创建一个新的Task出来,再创建目标Activity实例,并且将该实例加入到刚刚创建的Task中;

(2)如果已经存在该Activity实例的话,则不管该实例是处于系统中哪个Task任务栈中,都会将拥有该Activity的Task呈现在前台,从而将该Activity呈现出来;

也就是这种模式下能够保证该Activity是应用程序中唯一的;

上面四种模式中前两种模式很好理解,下面我们举例来看看模式3和模式4的差别:

     假设存在两个Task,分别为TaskA,TaskB,TaskA中存在ActivityD,TaskB中存在ActivityA,ActivityB,ActivityC;

情景1:现在将ActivityB的启动模式设置为SingleTask模式 

      首先启动TaskB中的ActivityA,从ActivityA跳转到ActivityB,可以发现ActivityA和ActivityB的TaskID是相同的,接着从ActivityB跳转到ActivityC,同样发现ActivityC的TaskID和ActivityA和ActivityB是相同的,这时候我们按下Home键,运行TaskA中的ActivityD来调用TaskB中的ActivityB,这时候发现ActivityB的TaskID是没有发生变化的,说明ActivityB是没有重新创建的,点击返回键,显示出来的是ActivityA界面而不是ActivityC界面,说明在SingleTask模式中会将TaskB栈中处于ActivityB上面的所有Activity全部出栈,直到ActivityB处于栈顶为止;

情景1:现在将ActivityB的启动模式设置为SingleInstance模式   

     首先启动TaskB中的ActivityA,从ActivityA跳转到ActivityB,可以发现ActivityA和ActivityB的TaskID是不相同的,印证了上面所说的SingleInstance模式会创建新的Task来存放生成的实例,而且这个Task中只会放一个实例,接着从ActivityB跳转到ActivityC,发现ActivityC的TaskID和ActivityA是相同的,原因在于如果Activity没有设置TaskAffinty,Activity会默认放到以包名命名的Task中;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值