笔记 - Android中Activity的启动模式
介绍Android中的Activity启动模式有好几种,但是博主记忆力跟鱼一样,属于隔天忘的那一种。所以写这篇文章来做一个学习记录。梗概活动的4种启动模式standardsingleTopsingleTasksingleInstance指定启动模式的方式第一种在xml中,在清单文件 AndroidMenifest.xml 中指定Activity的launchMode来指定启动模式<activ
介绍
Android中的Activity启动模式有好几种,但是博主记忆力跟鱼一样,属于隔天忘的那一种。所以写这篇文章来做一个学习记录。
梗概
活动的4种启动模式
- standard
- singleTop
- singleTask
- singleInstance
指定启动模式的方式
-
第一种(xml中)
在清单文件 AndroidMenifest.xml 中指定Activity的launchMode来指定启动模式<activity andorid:name="..." android:launchMaod="singleTask" android:label="@string/app_name" />
-
第二种(java中)
使用Intent启动Activity的时候,使用intent.addFlags(),通过设置标志位来指定启动模式Intent intent = new Intent(); intent.setClass(MainActivity.this, SecondActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
-
特别注意
这两种启动方式是有优先级概念的,直接在java代码中指定启动模式的优先级是高于在xml清单文件中指定的,即第二种方式的优先级高于第一种
我们假设一种情况,我们使用第一种方式指定启动模式为A,同时使用第二种方式指定启动模式为B,那么Activity会已模式B启动。
任务栈概念
任务栈是一种维护Activity的栈结构,我们可以Activity启动时的任务栈。
- 一个APP可以有很多任务栈
- 不同APP的Activity也可以在同一个任务栈中
- 一个任务栈中可以有很多Activity也可以只有一个Activity
- 既有前台任务栈,也有后台任务栈
启动模式
standard模式
standard模式是默认的启动模式,也就是说如果你没有指定启动模式的话,默认就是standard模式。在这个模式下,不管被启动的Activity实例是否已存在,都会创建一个新的Activity实例。
需要注意的是:standrad模式在默认情况下会把启动的Activity压入发起启动的Activity的任务栈中。
-
例子(这里使用大写字母来表示一个Activity,后面不在提示)
当前任务栈:AB,若使用standard模式启动B,那么任务栈会变成:ABB
-
使用ApplicationContext启动standard模式的Activity报错的原因
如上面标黄的注意,因为standard模式下,被启动的Activity会被压入启动方的任务栈中,而如果用ApplicationContext来启动standard模式的Activity的话,找不到启动方的任务栈,所以会报错。解决方法是指定标志位:FLAG_ACTIVITY_NEW_TASK,这样在启动的时候会为Activity新建一个任务栈
singleTop模式
这个模式是栈顶复用模式,就是说如果被启动Activtiy当前处于栈顶,那么不会重新新建这个Activity的实例,而是回调栈顶Activity的onNewIntent(),通过参数获取请求信息,onCreate、onStart不会被调用
- 例子
当前任务栈:AB,若使用singleTop模式启动B,那么任务栈会变成:AB
singleTask模式
这个模式是栈内复用模式,是单例模式,只会有一个Activity实例存在。当启动Activity时,寻找是否存在被启动Activity指定的任务栈,若存在任务栈,查找栈中是否存在Activity的实例,若栈中存在Activity的实例,则把Activity调到栈顶,与singleTop模式一样,回调Activity的onNewIntent()函数。若栈中不存在Activity的实例,则新建Activity实例压入该任务栈中;若不存在指定的任务栈,则新建任务栈,再新建Activity实例压入栈中
这里画一个流程图帮助理解
- 例子
- 当前任务栈1:AB,若使用singleTop模式启动C并指定任务栈1。任务栈1会变成:ABC
- 当前任务栈1:AB,若使用singleTop模式启动C并指定任务栈2。任务栈1不变:AB,新的任务栈2:C
- 当前任务栈1:ABCD,若使用singleTop模式启动B并指定任务栈1。任务栈1:AB
singleInstance模式
这也是一种单实例模式,与singleTask类似,但是比singleTask的约束更强。在这种模式下,Activity只能单独的存在与一个任务栈中。
- 例子
- 当前任务栈1:A,若使用singleInstance模式启动B。任务栈1不变:A,新的任务栈2:B
- 当前任务栈1:A、任务栈2:B,若使用singleInstance模式启动A。任务栈1、2都不变
总结
Activity的启动模式是很重要的,在不同的应用场景需要用到不同的启动模式,不能总是傻傻的使用standard模式来启动Activity。
更多推荐
所有评论(0)