介绍

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实例压入栈中

这里画一个流程图帮助理解

不存在
存在
存在
不存在
开始
启动A
是否存在A指定的任务栈
新建指定任务栈
栈中是否存在A
新建A并将A压入栈中
结束
将A调到栈顶
调用A的onNewIntent函数
  • 例子
    • 当前任务栈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。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐