Activity的启动模式以及setFlags

来源:互联网 发布:mac 命令行 编辑:程序博客网 时间:2024/05/17 03:42

1、Activity启动模式介绍:

Activity启动模式可以理解为Activity的启动方式或者启动策略,可以在AndroidManifest.xml文件的android:launchMode里面设置,也可以在代码Intent里面设置。

启动模式有4种,分别为standard、singleTop、singleTask、singleInstance;

对于Activity,Android采用任务栈来管理,在仅考虑一个任务栈的情况下先启动的先入栈,后启动后入栈,按下back键就会执行出栈的过程。

例如当A,B,C三个Activity依次启动,再按下back键时:


2、启动模式

2.1 standard:

这个是默认的启动模式,Activity每次启动都会创建出新的Activity加入到任务栈中,其入栈和出栈逻辑较为简单,为上面的任务栈演示图。

2.2 singleTop:

当栈顶有将要启动的Activity的实例时候就会重用该栈顶的Activity,此时会调用栈顶Activity的onNewIntent方法,若栈顶没有该Activity则会创建新的实例加入栈中。例如A跳转到启动模式为singleTop的B,B在栈顶,再启动B时会执行B的onPause->onNewIntent->onResume,此时按下back键回退到A


2.3 singleTask

如果栈内存在要跳转的Activity则使用该Activity,同时清空该Activity到栈顶的Activity,如果没有则创建新的实例。例如当A为singleTask时效果如下,


2.4 singleInstance

该模式启动的Activity会加入新的任务栈,该Activity可以被多个应用共享,并且只会创建一次,例如开启的浏览器可以共享。


3、补充:

3.1当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法

3.2普通界面建议使用singleTop,主界面通常为singleTask

4、setFlags:

setFlags是Intent的一个方法,通常用于Activity的启动设置

1)FLAG_ACTIVITY_CLEAR_TASK:

顾名思义,清空当前Task的所有Acitvity,之后再加入新创建的Activity,这个必须和FLAG_ACTIVITY_NEW_TASK一起使用,当C设置代码
Intent intent = new Intent(B.this,C.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);startActivity(intent);
结果为:


2)FLAG_ACTIVITY_CLEAR_TOP:

清除栈中元素使得存在的某个Activity位于栈顶,例如栈中有A B C,C再跳转到A最后栈结果为 A。

3)FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:

如果设置这个标志,这个Activity就不会在近期任务中显示。

4)FLAG_ACTIVITY_FORWARD_RESULT:

A startActivityForResult 启动 B,B设置 FLAG_ACTIVITY_FORWARD_RESULT启动C,则C的结果返回给A。注意B启动C的方式不能是startActivityForResult

5)FLAG_ACTIVITY_NO_HISTORY:

新的Activity不会入栈,A设置FLAG_ACTIVITY_NO_HISTORY启动B,B启动C最后结果为A C

6)FLAG_ACTIVITY_SINGLE_TOP:

类似lanchMode singleTop

7)FLAG_ACTIVITY_NEW_TASK:

新启动的Activity在新的任务栈,注意两个Activity的taskAffinity不同才回启动新的任务栈

注意:

如果调用Context(非Activity)的startActivity,要设置FLAG_ACTIVITY_NEW_TASK,否则会报错





0 0