Android笔记二:Activity启动模式

Activity启动模式

我们多次开启同一个Activity时候,系统会创建多个实例一一放入任务栈中,任务栈时先进后出,依次按back键退出时,Activity会一一退出,直至任务栈为空后被系统回收。但是一一退出同一个Activity多次其实不合理,所以就有Activity的四种启动模式:standard,singleTask,singleInstance和singleTop。

<activity android:name=".MainActivity" android:launchMode="standard" />

一、Activity四种模式

1.standard:标准模式

默认的activity的启动方式, 每次启动Activity都会创建一个实例在开启他的Activity所在的任务栈中,一个任务栈可以有多个实例,每个实例也可以属于不同的任务栈。比如Activity A启动了Activity B(标准模式),那么B就会运行在A所在的任务栈中。有没有注意到一个现象,当用ApplicationContext去启动standard模式的Activity时会报错:
这里写图片描述

这是因为standard模式的Activity会在开启他的Activity所在的任务栈,但是ApplicationContext是非Activity的Context,所以不在任务栈中,因此报错。解决方案:为待开启的Activity指定FLAG_ACTIVITY_NEW_TASK(首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈,如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity)标记位。因为这样就会创建一个新的任务栈,这个时候Activity启动的模式相当于singleTask。

2.singleTop:栈顶复用模式

在这种模式下,如果Activity已经位于栈顶,则不会重新创建新的Activity,复用栈顶的这个Activity,并且会调用onNewIntent函数,不会调用onCreate等函数,因为这个activity没有改变。如果这个Activity已经存在且不在栈顶,则会创建新的Activity,这个情况下和standard模式一样。
这里写图片描述

这里写图片描述

3.singleTask:栈内复用模式

如果在这种模式下,如果Activity在这个任务栈中存在该activity,多次启动activity都不会创建新的activity,都会复用该activity,并且将该activity至于栈顶,把它之上的所有activity都pop(singleTask默认具有clearTop效果),并且会调用onNewIntent函数。如果他不在任务栈中,那就重新创建新的activity,并且至于任务栈的顶部。

这里写图片描述

这里写图片描述

4.singleInstance:单实例模式

此种模式的Activity只能单独位于一个任务栈中,并让多个任务栈共享这个activity,任何任务栈想要激活activity时都会复用该任务栈的activity。此启动模式类似打开浏览器,多个程序访问浏览器时,如果浏览器没有打开,则打开浏览器,否则会在当前打开的浏览器中访问。此模式会节省大量的系统资源,因为他能保证要请求的Activity对象在当前的栈中只存在一个。
这里写图片描述

二、指定Activity启动模式方式

1.AndroidMenifest指定

<activity
    android:name="com.lynnlee.MainActivity"
    android:configChanges="screenLayout"
    android:launchMode="singleTask"
    android:label="test" />

2.代码方法指定

通过Intent中设置标志位来指定Activity启动方式。

Intent intent = new Intent(this,MainActivit.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

第一种设置启动模式优先级高,两种同时存在时,以第二种方式为准。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值