activity启动模式详解

activity为啥要设立启动模式这个机制呢?因为在默认情况下,我们每启动一个activity,不管其同样的实例存不存在,都将创建一个新的实例。这样非常没有效率,所以出现了启动模式这个东西,可以让我们修改activity的启动行为。

启动模式列举:
standard:系统默认模式。每启动一个activity,不管其实例存不存在,都将创建一个新的实例,一个任务栈中可以存在多个同样的实例。这样的情况下,活动A启动活动B,则活动B会运行在活动A所在的任务栈中。但是有一种情况需要注意,当我们使用ApplicationContext来启动activity时会出现runtime exception,这是因为ApplicationContext并没有任务栈存在(因为ApplicationContext是全局Context,不属于那个Activity)。解决方法也很简单,就是设置intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK),intent即为启动intent。这时待启动activity以singTask模式启动,会创建一个新的任务栈。

singleTop:栈顶复用模式。每启动一个activity,如果该activity的一个实例已经在任务栈顶部,则不会创建新的实例,而是调用onNewIntent()方法,在这个方法里我们做相应的处理。

singleTask:栈复用模式。跟singTop模式很像,不同处在于singTask模式只要在任务栈内存在相应activity的实例,新的实例就不会被创建,而是调用onNewIntent()方法,并且把该实例调到栈顶。

举几个例子仔细说明下:
1.任务栈a内部为ABC,这时需要启动活动D,如果活动D的TaskAffinity不同于a,为b,这时会新建一个任务栈b并将D加入其中。反之,如果D的TaskAffinity为a,这时因为a内部没有活动D的实例,因此,新建D的实例并加入到a中,这时a内部情况为ABCD
2.任务栈a内部为ABCDE,这时我们要启动活动B,显然,B要置换到栈顶,这个我们都知道。但是,当我们按下back键回退的时候,你会发现只有BA。纳尼?CDE去哪儿了?难道不满待遇辞工回家了?哈哈,开个玩笑,实际情况是,具有singTask启动模式的活动默认设立FLAG_ACTIVITY_CLEAR_TOP这个标记位。标记位的效果是,党活动启动时,在同一任务栈中所有在活动之上的activity都会出栈。

singleInstance:单实例模式。与singleTask类似,不同处在于一个任务栈只能拥有一个活动的实例,就是一个任务栈中的任务数恒定为1。

activity一些比较重要的参数介绍:
configChanges:什么样的情况下,活动不会重新建立。常用属性:orientation,keyboardHidden,local等
launchMode : 四个启动模式
TaskAffinity:活动的任务栈名称,默认情况下为包名。TaskAffinity一般和singleTask模式或者allowTaskPreparenting配合使用
allowTaskPreparenting:任务栈a的活动A启动任务栈b的活动B时,活动B会直接从任务栈b转移到任务栈a中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值