Activity的启动模式

activity有四种启动模式:standard、singleTop、singleTask、singleInstance

standard:标准模式,不管是否存在,每次启动activity都会启动一个新的实例,被创建的activity符合典型情况下的生命周期。一个任务栈可以有多个实例,一个实例也可以有多个任务栈。比如Avtivity A 启动了Activity B,那么B会进入到A的任务栈中。

singleTop:栈顶复用模式。如果新的Activity已经位于栈顶,呢么Activity不会被创建,会回调onNewIntent 方法。如果新的activity已经存在但不是位于栈顶,那么activity依旧会被重建。
比如说栈内的情况为ABCD,D在栈顶,D的模式为singleTop,那么栈内依然为ABCD;如果D的模式为standard,那么栈内的情况为ABCDD.

singleTask:栈内复用模式,这是一种单实例模式。只要activity在一个栈中存在,那么就不会被重新创建。系统也会回调其onNewIntent 方法。当有一个singleTask模式的栈启动后,系统会首先寻找是否存在activity A所想要的任务栈,如果不存在,就会重新创建一个任务栈,并把新的Acticity放到新的栈中。如果存在A所需要的任务栈,然后就判断该栈中是否存在A的实例,如果不存在就会创建新的A,如果存在,就会把A调到栈顶,并调用其onNewIntent 方法。
比如:目前任务栈S1中的情况为ABC,activity D以singleTask的方式请求启动,其所需要的任务栈为S2,由于S2和D的实例均不存在,则系统会先创建栈S2,然后创建D实例并放入到S2中。
假如D所需要的栈为S1,那么S1已经存在,那么系统会直接创建D并把其放入到栈S1.
如果D所需要的栈为S1,S1内的情况为ADBC,那么此时D不会被创建,会把D调到栈顶并调用onNewIntent 方法,同时会导致栈内所有在D上面的activity全部出栈,S1内的情况变为AD。

singleInstance:单实例模式。这是一种加强的singleTask模式。他除了具有singleTask模式所有的特性外,还加强了一点,那就是具有此模式的activity只能单独的位于一个任务栈中。比如activity A以singleInstance的模式启动,系统会创建一个新的任务栈,然后A独自运行在这个新的任务栈中。由于栈内复用的特性,后续的请求均不会创建新的activity。

在singeleTask中涉及到activity所需的任务栈,那么什么是activity所需的任务栈?
TaskAffinity意为任务的相关性,标识了一个activity所需的任务栈的名字,默认情况下为包名。我们可以单独指定该属性,但属性值不能与包名相同,否则没有任何意义。TaskAffinity属性主要与singeleTask启动模式与allowTaskReparenting属性相对应使用,否则没有意义。当TaskAffinity属性与allowTaskReparenting属性相对应使用时,当一个应用A启动了应用B的某个activity后,如果这个activity的allowTaskReparenting属性设置为true的话。此activity会直接从A的任务栈转移到应用B的任务栈。

activity的启动方式:1,通过AndroidMenifest为activity指定启动模式 android:launchMode=”singleTask”
2,在 intent中设置标志位来为activity指定启动模式。
Intent intent=new Intent();
intent.setClass(MainActivity.this,secondActivity.class);
intent.addFlags(Intent.Flag_ACTIVITY_NEW_TASK);
startActivity(intent);
第二种方式的优先级更高,但无法为activity指定singleInstance模式,第一种方法无法直接为activity设置FLAG_ACTIVITY_CLEAR_TOP标识。

activity的Flags
常用的有如下几种:
FLAG_ACTIVITY_NEW_TASK:为activity指定singleTask的启动模式。
FLAG_ACTIVITY_SINGLE_TOP: 为activity指定singleTop的启动模式。
FLAG_ACTIVITY_CLEAR_TOP:当它启动时,所有位于它上面的activity都会出栈。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值