说起Android中的启动模式,其实是个很基础的内容,谁都知道是4中启动模式,没错分别是以下四种:
1,standard
2,singleTop
3,singleTask
4,singleInstance
关于高深的纯理论说明这里就不多做赘述,毕竟文字说明太饶人,这里就准备说点简单的,能看得见的,现在开始吧。
第一种:standard(默认)
关于这种模式,大家都知道,就是Android默认的启动模式,就是不显示指定,就是这种模式。现在有FirstActivity和SecondActivity两个界面,代码里都打印了当前实例和taskId,格式为xx/xx
测试情景:重复跳转自己(自己设置standard)
794为task的Id,前面的为当前实例对象,可见每次都是新建的,并不是复用的。@f37d177是第一个页面,一共跳转了三次。同样退出应用也用了三次。
结论:standard模式下,会不断地新建activity实例,都放入同一个task中
第二种:singleTop
测试情景一:重复跳转自己(自己设置singleTop)
看起来好像没有点击一样,其实是点击了的,注意看Actionbar上的点击计数,点击了3次,三次的实例和taskId都是没有变化的,且最后退出应用就用了一次点击,如下图:
测试情景二:循环跳转到目标页面(SecondActivity设置singleTop)
可以看到两次跳转到SecondActivity时,实例都不一样,且最后返回到桌面也是和进入的次数一样多。这里进入了两次SecondActivity,且最终从SecondActivity退出应用,一共用了4次,如下图
结论:顾名思义,singleTop,如果当前实例在当前的task的栈顶,则直接复用,测试情景一;如果当前实例不再栈顶,则新建实例,如测试情景二,因为每次都是从FirstActivity跳转到SecondActivity的,虽然第二次跳转到SecondActivity的时候已经存在了SecondActivity实例,可是因为不在栈顶,所以又新建了一个SecondActivity实例。
第三种:singleTask
测试情景一:重复跳转自己(自己设置singleTask)
跳转了自己4次,可以看到实例和taskId都是没有变化,且最后一次就能退出应用,如下图:
测试情景二:循环跳转到目标页面(SecondActivity设置singleTask)
这里我们注意到一开始FirstActivity的实例为a2c5349,然后跳转到SecondActivity实际一直都是5d5dd2a,而且taskId两个界面也是一致的,最后在SecondActivity按了一次返回键,直接返回到了最初的a2c5349实例界面,也就是第一个界面,如下图:
结论:设置了singleTask的页面,只要是task中有这个实例,就会一直复用,而且每次复用这个已存在的实例,都会清空上面的其他实例(这里的FirstActivity),将自己直接提升到栈顶位置,显示自己
第四种:singleInstance
测试情景一:重复跳转自己(自己设置singleInstance)
跳转了5次,但是可以发现实例和task的值都没有变化,退出应用也只是一次退出,如下图:
测试情景二:循环跳转到目标页面(SecondActivity设置singleInstance)
可以看到一开始从FirstActivity跳转跳转到SecondActivity的时候,taskId发生了变化,FirstActivity的id是863,但是跳转到SecondActivity的时候变成了864,然后后面每次跳转到SecondActivity的时候实例和task的id都是没有变化;说说返回的场景
如果最后从FirstActivity返回,那么会把之前压入栈的FirstActivity全部返回完之后才进入SecondActivity页面,然后从SecondActivity一次就能退出应用;
如果最后从SecondActivity页面返回,那么一次就会回到FirstActivity,然后把之前压入栈的FirstActivity全部返回完才退出了应用;
压入栈的如下图所示:
结论:设置了singleInstance的页面,初始时都是新建一个task栈给这个页面,然后后面一直复用这个栈内的页面。注意,只有这种模式会新建一个栈给初始化的页面。最后返回的规律是,先把本页面所在的栈都出完,然后再弹出下一个栈的每个页面。
至此,四种模式简单分析完毕,希望能给大家一个直观的理解
上一篇:IDEA或者AS 中关于Git的常用操作