文章目录
Activity的四种启动模式
在清单文件中声明Activity时,可以使用元素的launchMode属性指定Activity应该如何与任务关联.launchModel属性指定有关应如何将Activity启动到任务的指令,有四种
-
1.standard(默认模式)
默认,系统在启动Activity任务中创建Activity的新实例并向其传送Intent.Activity可以多次实例化,而每个实例均均可属于不同的任务,并且一个任务可以拥有多个实例. -
2.singleTop(栈顶复用模式)
如果当前任务的顶部已存在Activity的一个实例,则系统会通过调用该实例的onNewIntent()方法向其传送Intent,而不是创建Activity的新实例.Activity可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例(但前提是位于返回栈栈顶的Activity并不是Activity的现有实例).例如:假设任务的返回栈包含根Activity A以及Activity B,C和位于顶部的D(堆栈是A-B-C-D;D位于顶部).收到针对D类Activity的Intent.如果D具有默认"standard"启动模式,则会启动该类的新实例.且堆栈会变成A-B-C-D-D.但是,如果D的启动模式为"singleTop",则D的现有实例会通过onNewIntent()接受Intent,因为它位于堆栈的顶部;而堆栈仍为A-B-C-D.但是,如果针对B类Activity 的Intent,则会向堆栈添加B的新实例,即便其启动模式为"singleTop".
-
3.singleTask(栈内复用模式)
系统创建新任务并实例化位于新任务底部的Activity.但是如果另外的任务中已存在该Activity的实例,则系统会通过调用其onNewIntent()方法将Intent传送到该现有实例,而不是创建新实例.Activity一次只能有一个实例存在.
也就是说:若须要创建的Activity已经处于栈中时,此时不会创建新的Activity,而是将存在栈中的Activity上面的其他Activity所有销毁,使它成为栈顶。该模式默认具有clearTop的效果. -
4.singleInstance(单实例模式)
与"SingTask"相似,唯一不同的是系统不会将任何其他Activity启动到包含该实例的任务中.该Activity始终是其任务唯一的成员;由该Activity启动的任何Activity都会在其他的任务中打开.可以将他看成是一种加强的SingleTask模式。它除了具有它所有特性外,还加强了一点:具有此模式的Activity仅仅能单独位于一个任务栈中。
除了在清单文件中声明之外,还可以通过在传递给startActivity()的Intent中加入相应的标志,修改Activity与其任务的默认关联方式.也有四种:
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- FLAG_ACTIVITY_NEW_TASK
会产生与"singleTask" launchModel相同的效果 - FLAG_ACTIVITY_SINGLE-TOP
会产生与"singleTop" launchModel相同的效果 - FLAG_ACTIVITY_CLEAN_TOP
具有此标记位的Activity,启动时会将与该Activity在同一任务栈的其他Activity出栈。一般与SingleTask启动模式一起出现。它会完毕SingleTask的作用。但事实上SingleTask启动模式默认具有此标记位的作用
FLAG_ACTIVITY_CLEAR_TOP 通常与 FLAG_ACTIVITY_NEW_TASK 结合使用。一起使用时,通过这些标志,可以找到其他任务中的现有 Activity,并将其放入可从中响应 Intent 的位置
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有此标记位的Activity不会出如今历史Activity的列表中,使用场景:当某些情况下我们不希望用户通过历史列表回到Activity时,此标记位便体现了它的效果。它等同于在xml中指定Activity的属性:
android:excludeFromRecents="trure"