Android启动模式

作用:通过在AndroidManifest.xml中配置android的启动模式属性,可以决定Activity是如何启动的。总共有四种模式。

这四种模式分别为:
//standard
//默认的启动模式,在该模式下每次都创建一个新的activity。

//singleTop
//打开的activity如果存在栈顶的话就不创建新的activity,否则就创建。


//singleTask
//打开栈里面的activity,不创建新的activity,同时摧毁他们之间的activity。

singleInstance

在一个新的栈中创建activity实例,并让多个应用共享栈中的activity实例,一旦该模式的Activity的实例存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。

注:Task就是Activity的任务栈,它简单的说,就是一组以栈的模式聚集在一起的Activity组件集合,记录着用户的行为。(这里只提它和Activity的启动模式来讲)


下面详细的解释各种启动方式:

standard(创建一个新的activity)

Activity的默认加载方法,该方法会启动创建一个新的activity实例,同时将该实例压入到栈中(不管该activity是否已经存在在Task栈中,都是采用new操作),并调用这个新Activity的OnCreate()方法。
例如: 栈中顺序是A B C D ,此时D通过Intent跳转到A,那么栈中结构就变成 A B C D A ,点击返回按钮的 显示顺序是 D C B A,依次摧毁。
一句话记忆:无论栈中是否已经创建过,它都会创建一个新的并置于栈顶并显示,调用oncreate方法。

使用场景:默认的Activity的启动模式。
这里写图片描述


singleTop (打开的activity如果存在栈顶则不创建新的activity否则就创建新的,不管栈是否有这个activity)

假设栈内已存在A B C D,singleTop模式下,分以下两种情况。

(1)当前App应用展示的是D或者栈顶是D,如果这个时候通过Intent需要打开D,那么不会重新创建一个新的D实例,而是调用栈顶的D,并调用它的onNewIntent方法(注意不是oncreate方法,只有创建一个新的实例Activity才会调用Oncreate方法)所以栈中的结构依旧为A B C D。如下图

这里写图片描述

注: 那么,让我们想想,这种情况什么时候会发生呢?好像有点矛盾,当前的显示的或者栈顶的activity,通过Intent或者打开同样的activity,有这种用法和必要吗?

比如:当前的app栈顶为A,这时候,突然来了个消息通知,这个消息通知需要通过Intent去打开A,那么我们点击这个消息通知打开A的时候,此场景就复现了,它将不会创建一个新的A,而是复用栈顶的A,并执行onNewIntent方法。

(2)当前App应用展示的是D或者栈顶是D,如果这个时候需要打开B,那么由于B不处于栈顶,所以会新建一个B实例并压入到栈中,并调用新创建B的onCreate方法,结构就变成了A B C D B。

这里写图片描述


singleTask(打开已有的,销毁之上的)

singleTask模式下,Task栈中有且只能有一个对应Activity的实例。

例如:当前栈的结构为:A B C D。 此时D通过Intent打开B,则栈的结构变成了:A B。其中的C和D被栈弹出销毁了,也就是说位于B之上的实例都被销毁了。而不会创建原有的B,此时调用一个新的B实例,而是使用栈中原B的onNewIntent()方法。

这里写图片描述
这里写图片描述

注释 此模式较为常见,在activity栈中,因为应用需要,通常需要打开多个相同或者不同的Activity,那么这样,Activity栈会越来越大,从而消耗的内存也会越来越大,如果Activity配置了这个属性就无敌了,它会怎么做呢?如果在已经打开A后打开了B C D E…等等,如果这个时候你需要打开A,但又想销毁B C D E…的时候,此属性就满足需求了,这时候你会发现你内存使用就下降了,因为B C D E…已经被销毁。
当然,并不是说设置了singleTask就通用一切了,前面说过了,每种用法都有其自身道理,singleTask想做到的是,显示当前堆栈中已存在的Activity并不重新创建,而是复用,如果堆栈中已存在需要打开的Activity,那么先将此栈中Activity之上的其它Activity销毁,露出已存在的Activity,并执行它的onNewIntent方法。当然,如果当前栈中不存在,那就创建一个新的置于栈顶。

一句话记忆:只要A存在栈内,那么就将A之上的全部销毁(不包含A),同时显示并复用A,执行onNewIntent方法。否则,创建一个新A置于栈顶。


singleInstance

singleInstance模式下,会创建一个新的Task栈。
例如:当前栈的结构为:A B C D。
在D中通过Intent打开E(E的模式为singleInstance),那么会新建一个Task 栈2,栈Task 1中结构依旧为A B C D,栈2中结构为E,此时屏幕中显示E。
此类模式,通常会在打开另一个App才会使用。比如:打电话,使用频率高,耗资源的应用。在应用中打开微信、新浪微博等客户端。

这里写图片描述


Intent Flag描述启动模式

Flags: 表示Intent的标志位,常用于Activity的场景中,它和Activity的启动模式有着密切的联系,简单说,flag的有效组合(通常用“|“组合使用)决定如何打开Activity。

//Intent.FLAG_ACTIVITY_NEW_TASK (默认)
//默认的跳转类型,它会重新创建一个新的Activity。

//FLAG_ACTIVITY_SINGLE_TOP

//这个FLAG就相当于启动模式中的singletop,请参考singletop说明。
//FLAG_ACTIVITY_CLEAR_TOP

//这个FLAG启动的Activity会把要启动的Activity之上(包含自身)的Activity全部弹出栈空间。例如:原来栈中的结构是A B C D ,从D中跳转到B,释放顺序为D C B,然后重新创建B置于栈顶,栈中的结构就变为了A B了。(这个方法可以用来关闭多个Activity)

//经验:需要销毁栈中A之前的多个activity,但并不想销毁A,就需要FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP组合使用

 // FLAG_ACTIVITY_CLEAR_TASK
 //这个Flag使用的前置条件为:API level 11 以上版本,并且需要与FLAG_ACTIVITY_NEW_TASK一起使用。此标识,用于释放当前栈中所有的activity,然后再创建新的Activity对象置于栈顶。
 //例如栈中原有A B C D,需要从D跳转到B,依次释放D C B A,然后创建B,置于栈顶。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值