转载请标明出处
http://blog.csdn.net/mohan6/article/details/73176562
本文作者:【默寒的博客】
Activity的四种启动模式:
便于记忆:
1、standard(默认)
每次跳转都会创建一个新的Activity对象
2、singleTop 栈顶单实例
a、当activity不存在的时候,创建一个新的Activity对象加载到当前Task里面
b、如果Activity已经存在,并处于栈顶,开启自身不会再创建新的Activity对象
c、如果Activity已经存在,处于栈中,开启该界面创建一个新的Activity对象加载到当前Task中
3、singleTask 栈中单实例
a、当Activity不存在的时候,创建一个新的Activity对象加载到当前Task里面
b、如果Activity已经存在,并处于栈顶,开启自身不会再创建新的Activity对象
c、如果Activity已经存在,处于栈中,开启该界面把目标Activity之上的所有Activity都销毁
4、singleInstance 全局单实例
a、如果Activity不存在的时候,创建一个新的Task,然后把创建目标Activity添加到Task中
b、如果目标Activity已经存在,把目标Activity所在的Task移到前台
累赘的表述:
1、standard:每一次start都会开启一个新的activity,并且位于栈顶
2、singleTop:如果要开启的activity位于栈顶,那么重用该activity,并且走onNewIntent而不走onCreate;如果不是位于栈顶,那么重新创建activity,并位于栈顶
3、singleTask:一个栈中只有唯一的该activity实例,如果要开启的activity位于栈中,那么将位于其上的activity全部出栈,使要开启的activity位于栈顶,并且同样的是走onNewIntent而不走onCreate;如果要开启的activity不在栈中,那么重新创建
4、singleInstance:一个栈中只有一个activity。如果要开启的activity位于栈中,那么再次开启的话,就是将整个栈至于所有栈的前面进行展示。
有四种启动模式
* standard 标准的启动模式。一个activity默认就是标准的启动模式。开启新的activity,activity就会被创建出来,加入到任务栈的栈顶。适用于绝大多数的应用场景。
* singleTop 单一顶部启动模式。如果发现,这个activity已经被启动了,并且在任务栈的栈顶,activity就不会别重新创建。解决一个用户体验的问题。避免已经打开的界面重复的被打开多次。
for(int i = 0;i<100;i++){
弹出收藏夹
}
浏览器添加到书签,singletop
>在同一个任务栈里面可以有多个实例存在。
* singleTask 单一任务栈启动模式。开启新的activity的时候,会去检查任务栈里面是否有这个activity的实例存在,如果有实例存在,就直接清空这个实例上面的所有的activity,复用这个已经存在的activity实例。
>在同一个任务栈里面只有一个实例存在。
在什么时候使用singletask模式。
BrowserActivity 浏览器 开销(内存占用,cpu占用)非常大,singletask。保证在一个任务栈里面只有一个实例存在。
webkit 内核 页面。
html解析器
html渲染器
css 渲染器
javascript 执行引擎
>>如果一个activity的资源开销非常大,建议使用singletask的启动模式。
浏览器的activity使用的就是singletask的启动模式。
* singleinstance 单一实例。类似于java中的单例模式,单态模式。在整个android手机操作系统里面只有一个activity的实例存在。
singleinstance启动模式的activity会运行在自己**_单独_**的任务栈里面
>如果你希望一个activity,在整个手机操作系统里面只有一个实例存在。配置singleinstance。
>InCallScreen 通话的activity配置模式是singleinstance的。在整个手机操作系统里面只有他一个实例存在。
Intent标志位
intent.setFlags(XXXXX);
1、Intent.FLAG_ACTIVITY_SINGLE_TOP
跟加载模式中singleTop栈顶单实例类似
2、Intent.FLAG_ACTIVITY_CLEAR_TOP
跟加载模式中singleTask区别:
如果activity已经存在,并处于栈中,会把目标Activity 之上的所有Activity都销毁(包括自身),重新创建一个新的Activity
3、Intent.FLAG_ACTIVITY_NEW_TASK
如果在service中跳转Activity,必须去设置意图标志位
Intent.FLAG_ACTIVITY_NEW_TASK