android Activity的四种启动模式详讲 singleTop standard singleTask singleInstance

 学习安卓也有好长时间了,对于activity的启动模式还是有点模糊。找个个时间详细的看了一下。顺便总结一下。。

   Activity的四种启动模式为:standard,singleTop,singleTask,singleInstance。

(一):standard(标准模式)

这个是默认的模式。activity是该模式时,每次启动都会创建一个实例,放入启动这个activity所在的栈中。

(二):singleTop(栈顶复用模式)

在该模式下,启动这个activity时,会先判断栈顶是不是这个activity的实例,如果是则不在创建新的activity,直接复用该实例。如果不是则会重新创建一个实例,放入栈中。复用就会执行onNewIntent()方法。

证明:1.有两个activity。A和B,B的启动模式为singleTop。A-->B-->B. 打印的log如下:


可以发现,还是在这个栈中,并复用了该实例。

2.现在有三个activity:ABC,B的模式还是singleTop ,启动步骤为:A-->B-->C--B。log如下:


可以发现如果不在栈顶会重现创建一个实例

     (三):singleTask(栈内复用模式)

在该模式下,启动这个activity时,会先判断栈内有没有该实例,如果有则不再创建,把该实例提到栈顶,并把这个实例之上的实例全部出栈(亦可以说清除)。复用就会执行onNewIntent()方法。

这里还有一个任务栈的问题,怎么来确定放入哪个栈中(所有模式同理),启动该activity的实例在哪个栈中就放入哪个栈,如果activity设置了taskAffinity(可以理解为栈名)这个参数(必须有“.”  ,系统默认的是应用的包名,)则会创建一个新栈来放该实例。

证明:有三个activity。ABC。A的启动模式为singleTask。启动顺序A-->B->C-->A。log如下:


发现复用的这个实例。当我按back时,发生了什么????结果直接回到了桌面。这也可以证明把这个栈中A实例之上的实例全部出栈(亦可以说清除)。新建栈这个例子就不写出来了。有兴趣大家可以自己动手证明一下。。

    (四):singleInstance(单实例模式)

在该模式下,启动的activity会重新创建一个栈,放入其中,该activity独享这一个栈。

证明:有ABC 三个activity,B和C模式为singleInstance。执行顺序为A-->B-->C-->B。log如下:


很明显可以看出不在一个栈中,最后启动B时会复用B的实例。

发布了38 篇原创文章 · 获赞 60 · 访问量 16万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章