注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

倚天剑

青春要在奔跑中度过

 
 
 

日志

 
 
 
 

Activity的启动模式  

2013-09-24 14:48:31|  分类: 开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
启动模式允许开发者定义一个activity的新实例如何与当前的Task关联。可以定义使用俩种方法来定义。



如果Activity A开启Activity B, Activity B就可以在它的manifest文件中定义它与当前的task如何关联,Activity A也可以要求activity B应该如何与当前的task关联。如果两个activity都定义了Activity B应该如何与一个task关联,Activity A的要求(在intent中定义的)将会覆盖Activity B中要求(在manifest文件中定义的)。



注意:一些在manifest中的登录模式在intent中不再可用,同样地,一些在intent中定义的标志也可能没有在manifest中未定义。



Using the manifest file



当在manifest文件中声明activity时,可以指定这个activity开启时如何与当前task关联。



<activity>标签的launchMode属性可以设置为四种不同的模式:



    “standard”(默认模式)



    “singleTop”



    “singleTask”



    “singleInstance”



    这几种模式的区别体现以下四点上:



    1)当这个activity被激活的时候,会放入哪个任务栈。



    对于“standard”和“singleTop”模式,这个新被激活的activity会放入和之前的activity相同的任务栈中――除非Intent对象包含FLAG_ACTIVITY_NEW_TASK标志。



    “singleTask”并不会每次都新启动一个task。如果已经存在一个task与新activity亲和度(taskAffinity)一样,则activity将启动到该task。如果不是,才启动一个新task。同一个application里面,每个activity的taskAffinity默认都是一样的。



    “singleInstance”模式则表示这个新被激活的activity会重新开启一个任务栈,并作为这个新的任务栈的唯一的activity。



    2)是否可以存在这个activity类型的多个实例。



    对于“standard”和“singleTop”模式,可以有多个实例,并且这些实例可以属于不同的任务栈,每个任务栈也可以包含有这个activity类型的多个实例。 



  “singleTop"要求如果创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。 



  “singleTask”和”singleInstance”则限制只生成一个实例。



  3)包含此activity的任务栈是否可以包含其它的activity。



    “singleInstance”模式表示包含此activity的任务栈不可以包含其它的activity。若此activity启动了另一个activity组件,那么无论那个activity组件的启动模式是什么或是Intent对象中是否包含了FLAG_ACTIVITY_NEW_TASK标志,它都会被放入另外的任务栈。在其它方面“singleInstance”模式和“singleTask”模式是一样的。



    其余三种启动模式则允许包含此activity的任务栈包含其它的activity。



    4)是否每次都生成新实例



    对于默认的“standard”模式,每当响应一个Intent对象,都会创建一个这种activity类型的新的实例。即每一个activity实例处理一个intent。



    对于“singleTop”模式,只有当这个activity的实例当前处于任务栈的栈顶位置,则它会被重复利用来处理新到达的intent对象。否则就和“standard”模式的行为一样。



    “singleInstance”是其所在栈的唯一activity,它会每次都被重用。



     对于“singleTask”模式的acitvity,在其上面可能存在其它的activity组件,所以它的位置并不是栈顶,在这种情况下,intent对象会被丢弃。(虽然会被丢弃,但是这个intent对象会使这个任务栈切换到前台)



    注意:



    当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法 

若为了处理一个新到达的intent对象而创建了一个activity实例,则用户按下“BACK”键就会退到之前的那个activity。但若这个新到达的intent对象是由一个已经存在的activity组件来处理的,那么用户按下“BACK” 键就不会回退到处理这个新intent对象之前的状态了。



Using Intent flags



当开启一个activity时,可以通过在intent中包含标志来修改activity的默认的与当前task的关联,然后将该intent传递给startActivity().可以修改的默认的标志为:



FLAG_ACTIVITY_NEW_TASK

在一个新的task中开启一个activity。如果包含该activity的task已经运行,该task就回到前台,activity通过onNewIntent()接受处理该intent。

这是与"singleTask"登录模式相同的行为。

FLAG_ACTIVITY_SINGLE_TOP

如果要被开启的activity是当前的activity(在返回栈的顶部),已经存在的实例通过onNewIntent()接收一个调用,然后处理该intent,而非重新创建一个新的实例。

这与"singleTop"登录模式有相同的行为。

FLAG_ACTIVITY_CLEAR_TOP

如果要被开启的activity已经在当前的task中运行,系统不会生成该activity的一个新的实例,在该栈顶部的所有其他的activity会被销毁,这个intent通过 onNewIntent()被传递给该重新运行的activity的实例(现在在栈顶部)。

manifest中没有相对应的属性。



FLAG_ACTIVITY_CLEAR_TOP经常和FLAG_ACTIVITY_NEW_TASK一起使用.当一起使用时,这些标志可以确定一个存在的activity在另一个task中的位置,并且将其放置于可以响应intent的位置(FLAG_ACTIVITY_NEW_TASK确定该activity,然后FLAG_ACTIVITY_CLEAR_TOP销毁顶部其他的activity)。如果指定的activity的登录模式是"standard",也会被从栈中移除,一个新的实例也会被登录到它的位置来处理到来的intent。那是因为当登录模式为 "standard"时,一个新的实例总是被创建
  评论这张
 
阅读(99)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018