Android Activity Lanchemode

    Android管理activity应用栈的模式,app的入口activity为栈的第一个元素,然后每打开一个activity,系统就把这个activity压入栈中。当前的acitity都处于栈顶。栈遵守先进后出的原则。 这都是默认的设置模式。有些情况下要求自己定义activity的存储方式。

  

   android自己定义activity启动方式有两种方式,一种是在manifest中声明activity的时候设置activity的属性,android:launchMode="",

或者用intent的方式声明即将启动的activity应用哪种启动方式。

  在manifest中设置activity的属性,有四种方式,Standard , SingleTop, SingleTask, SingleInstance.

  Standard模式,是android的默认模式,此类activity启动时,会将实例放入启动它的activity的task中。并且处于唤起他的activity的上面。这样的activity可以多次实例化。比如这个activity自己启动自己,那么系统将会重新实例化一个。这样栈中就有连续两个这样的activity实例。

 

  Singletop模式,这类activity是指当此activity处于栈顶时,再调用它,它不会重新实例化一个实例,而是通过 onnewIntent()函数进入已经实例化的activity中。这类activity也可以多次实例化的,并且可以在不同的task中实例化。只有它处于栈顶时候启动它才不会实例化。加入它没在栈顶,你去启动它,他还是会实例化。

 

  SingleTask模式,这类activity启动时系统会创建一个新的task,这个activity会作为task的第一个元素保存。这类activity在一个task中只能实例化一次。当task中含有这样的activity时,启动它时会通过onnewintent()函数进入这个实例,但是注意如果这时候在这个task中还有其他activity实例,在singletask  activity之上的activity都会被释放清空。

 

  SingleInstance模式,这类activity同singletask很相似,但是它启动时创建一个新的 task并且这个task只有这个activity实例。所以无论哪个activity被它唤起,都会处于一个新的task。

 

   例如有activity  a,b,c,d.  a是app的主activity使用singletask模式。 其中b是默认模式,c是singletop模式,d是默认模式,e是默认模式,a启动b之后,这个时候task中的任务是 a->b, 这个时候b再启动自己,系统还是会实例化一个b,此时task的情况是a->b->b.如果再多次启动b仍然会实例化很多b。这个时候b再启动c。task情况 a->b->b->c, 这个时候c启动自己。它不会再次实例化,会调用nonewintent函数。这个时候task仍然是a->b->b->c. 这个时候再次启动d。task为a->b->b->c-d。 如果d再次启动c。这个时候就会开始实例化一个c,因为c并不是处于栈顶。 所以这个时候task为 a->b->b->c->d->c. 如果这个时候c再次启动a。系统不会实例化a。而是会从a中的onnewintent进入a。并且a上面的activity都会被释放。释放顺序是从下到上。比如此例中会依次调用b->b->c->d中的ondestroy,因为栈顶的c还处于前端暂时不会调用它的ondestroy,先去调用a中nonewintent()。等a处于前端了才会再调用c的ondestroy。这是activity的生命周期中确定的。平时应用时要注意,这里有一个时间差。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值