Activity启动模式 及 Intent Flags 与 栈 的关联分析
2015-08-11 14:57 三戒1993 阅读(125) 评论(0) 编辑 收藏 举报1.什么是栈
栈
栈是一种常用的数据结构,栈只允许访问栈顶的元素,栈就像一个杯子,每次都只能取杯子顶上的东西,而对于栈就只能每次访问它的栈顶元素,从而可以达到保护栈顶元素以下的其他元素.”先进后出”或”后进先出”就是栈的一大特点,先进栈的元素总是要等到后进栈的元素出栈以后才能出栈.递归就是利用到了系统栈,暂时保存临时结果,对临时结果进行保护.
</pre><pre id="best-content-1325062230" class="best-text mb-10" name="code" style="white-space: pre-wrap; word-wrap: break-word; line-height: 24px; margin-top: 0px; margin-bottom: 10px; padding: 0px; background-color: rgb(255, 255, 255);"><h2 style="margin: 0px; padding: 0px; font-family: arial, 'courier new', courier, 宋体, monospace;"><a target=_blank name="t2" style="color: rgb(255, 153, 0);"></a><span style="font-size: 18px;">定义栈(Stack)</span></h2><span style="color: rgb(51, 51, 51); font-family: arial, 'courier new', courier, 宋体, monospace;"><strong>栈的定义栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。(1)通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。 (2)当表中没有元素时称为空栈。(3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表。栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除。</strong></span>
<span style="font-family: arial, 'courier new', courier, 宋体, monospace; color: rgb(51, 51, 51);"><strong> </strong></span><h2 style="margin: 0px; padding: 0px; font-family: arial, 'courier new', courier, 宋体, monospace;"><a target=_blank name="t3" style="color: rgb(255, 153, 0);"></a><span style="font-size: 18px;">栈的操作</span><span style="font-size: 14px; color: rgb(51, 51, 51);">:压栈、弹栈 </span></h2><div style="color: rgb(51, 51, 51); font-weight: bold; font-family: arial, 'courier new', courier, 宋体, monospace;"> </div><h1 style="margin: 0px; padding: 0px;"><a target=_blank name="t4" style="color: rgb(255, 153, 0);"></a><span style="font-family: KaiTi_GB2312; font-size: 24px;">2.Activity中的栈</span></h1><div><span style="font-family: KaiTi_GB2312; font-size: 24px;"> </span></div>
Android的管理主要是通过Activity栈来进行,当一个Activity启动时,系统会根据其配置将它压入到一个特定的栈中,系统处于运行状态。当用户点击返回或则FINISH()了该Activity,那么它便会被从栈中压出,随之摧毁,按照Activity的生命周期可以知道,如果当前显示的栈中Activity没有被摧毁,那么打开新的Activity时候,会将新打开的压入到栈,原来的根据其显示情况选择状态变化(原Activity依旧可见,变为暂停状态(Paused),如果被完成遮住了,转变为停止状态(Stopped))。
</pre><pre id="best-content-1325062230" class="best-text mb-10" name="code" style="white-space: pre-wrap; word-wrap: break-word; color: rgb(51, 51, 51); font-family: arial, 'courier new', courier, 宋体, monospace; font-weight: bold; line-height: 24px; margin-top: 0px; margin-bottom: 10px; padding: 0px; background-color: rgb(255, 255, 255);">
</pre><pre id="best-content-1325062230" class="best-text mb-10" name="code" style="white-space: pre-wrap; word-wrap: break-word; color: rgb(51, 51, 51); font-family: arial, 'courier new', courier, 宋体, monospace; font-weight: bold; line-height: 24px; margin-top: 0px; margin-bottom: 10px; padding: 0px; background-color: rgb(255, 255, 255);">
3.Task
4.Activity启动模式
"singleTop"
"singleTask"
"singleInstance"
以下举例说明它们的区别:
standard:Activity的默认加载方法,该方法会通过跳转到一个新的activity,同时将该实例压入到栈中(不管该activity是否已经存在在Task栈中,都是采用new操作)。例如: 栈中顺序是A B C D ,此时D通过Intent跳转到A,那么栈中结构就变成 A B C D A ,点击返回按钮的 显示顺序是 D C B A,依次摧毁。
singleTop:singleTop模式下,当前Activity D位于栈顶的时候,如果通过Intent跳转到它本身的Activity (即D),那么不会重新创建一个新的D实例,所以栈中的结构依旧为A B C D,如果跳转到B,那么由于B不处于栈顶,所以会新建一个B实例并压入到栈中,结构就变成了A B C D B。
singleTask:singleTask模式下,Task栈中只能有一个对应Activity的实例。例如:现在栈的结构为:A B C D。此时D通过Intent跳转到B,则栈的结构变成了:A B。其中的C和D被栈弹出销毁了,也就是说位于B之上的实例都被销毁了。
singleInstance:singleInstance模式下,会将打开的Activity压入一个新建的任务栈中。例如:Task栈1中结构为:A B C ,C通过Intent跳转到了D(D的模式为singleInstance),那么则会新建一个Task 栈2,栈1中结构依旧为A B C,栈2中结构为D,此时屏幕中显示D,之后D通过Intent跳转到D,栈2中不会压入新的D,所以2个栈中的情况没发生改变。如果D跳转到了C,那么就会根据C对应的launchMode的在栈1中进行对应的操作,C如果为standard,那么D跳转到C,栈1的结构为A B C C ,此时点击返回按钮,还是在C,栈1的结构变为A B C,而不会回到D。
5.Activity栈和Task联系
6.Intent Flags
7.Activity相关属性taskAffinity
Activity为Task拥有的一个affinity。拥有相同的affinity的Activity理论上属于相同的Task(在用户的角度是相同的“应用程序”)。Task的affinity是由它的根Activity决定的。
affinity决定两件事情——Activity重新宿主的Task(参考allowTaskReparenting特性)和使用FLAG_ACTIVITY_NEW_TASK标志启动的Activity宿主的Task。
默认情况,一个应用程序中的所有Activity都拥有相同的affinity。捏可以设定这个特性来重组它们,甚至可以把不同应用程序中定义的Activity放置到相同的Task中。为了明确Activity不宿主特定的Task,设定该特性为空的字符串。
如果这个特性没有设置,Activity将从应用程序的设定那里继承下来(参考<application>元素的taskAffinity特性)。应用程序默认的affinity的名字是<manifest>元素中设定的package名。
版权声明:本文为博主原创文章,未经博主允许不得转载。