什么是Activity的启动模式?当启动一个Activity的时候,系统会创建一个实例,并把它放入到一个任务栈中,至于如何存放,就是由这个启动模式来决定的。Android系统支持多任务,所以系统中会同时存在多个任务,而一个App中的组件可能存在于不同的任务栈中,甚至一个App的某个activity可以单独存在于独立的一个任务栈,并且一个任务栈中也可能存在来自不同App的activity实例。

Activity的LaunchMode有四种启动方式:standard、singleTop、singleTask、singleInstance,他们的具体含义如下:

(1)standard:默认的启动模式,每次启动都会去创建新的Activity实例,并且有完整的生命周期回调,在这种模式下,新启动的activity会存在于启动它的那个activity的栈中。由于这个特性,会引发一个问题,当我们尝试使用ApplicationContext来启动使用了standard模式的activity时,会出现如下错误:

E/AndroidRuntime(3403): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

这是因为ApplicationContext是非activity类型的context,它没有任务栈,导致新启动的activity“无家可归”,解决办法就是将要启动的activity设置为FLAG_ACTIVITY_NEW_TASK模式,让它在启动的时候创建一个新的任务栈。

(2)singleTop:栈顶复用模式,这种模式下,如果新的activity已经在当前栈顶存在实例,则此activity不会重新创建,转而会回调它的onNewIntent方法,这个回调方法会携带Intent参数,可以用来获取传递的参数。此时因为没有创建新的实例,所以onCreat和onStart并不会回到,如果当前栈内已存在有此activity的实例,但是不位于栈顶,新的实例仍然会被创建。

(3)singleTask:栈内复用模式。这种模式只要栈内存在待启动activity实例,就不会重新创建实例,与singleTop一样,只会回调OnNewIntent方法,并通过把栈内实例顶部的其他实例全部出栈,来让新的activity实例处于栈顶。

(4)singleInstance:单实例模式,这可以看成是加强版的singleTask模式,因为使用这种模式的activity,会启动在单独的一个栈中。

想要给activity知道启动模式有两种方法,第一种是在AndroidMenifest.xml文件中给activity设置 android:launchMode="singleTask" 另一种情况就是通过Intent中设置标志位来指定intent.addFlages(Intent.FLAG_ACTIVITY_NEW_TASK) ,这两种方式是有区别的,第一,优先级不同,第二种模式比第一种模式优先级高,即当两种方法同时使用时,以第二种为准;第二,限定范围不同,第一种无法为activity设定FLAG_ACTIVITY_CLEAR_TOP标识,第二种无法指定为singleInstance模式。


上面说到activity的Flags即标志位,标志位的作用有很多,可以设定activity的启动模式,决定activity的运行状态等。下面记录几个常用的标志位:

  1. FLAG_ACTIVITY_NEW_TASK

    这个标志位的作用就是指定activity为“singleTask"模式。

  2. FLAG_ACTIVITY_SINGLE_TOP

    这个标志位的作用就是指定activity为“singleTop"模式。

  3. FLAG_ACTIVITY_CLEAR_TOP

    这个标志位的作用就是当栈中存在有待启动的activity的实例时,会清空该实例顶部使得待启动activity处于栈顶位置。

  4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 该标志使得启动的activity不会出现在activity历史列表当中。

#读书笔记 Android-Activity启动模式相关推荐

  1. Android activity启动模式

    如何正确理解和使用 Activity的4种启动模式 关于Activity启动模式的文章已经很多,但有的文章写得过于简单,有的则过于注重细节,本文想取一个折中,只关注最重要和最常用的概念,原理和使用方法 ...

  2. Android Activity 启动模式详解

    最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...

  3. Android Activity启动模式,回退栈管理!

    (一): Activity被回收了怎么办?当系统内存不足的时候Activity是有可能被回收的,打个比方用户在A Activity启动了B Activity那么A就处于停止状态,由于内存不足A会被回收 ...

  4. Android Activity启动模式总结

    简介 Activity 作为 Android 四大组件之一,几乎是被接触得最多的.Activity 中有个启动模式的概念,分别是 standard.singleTop.singleTask 以及 si ...

  5. android activity启动模式_从0系统学Android--2.5Activity启动模式

    本系列文章目录:更多精品文章分类 本系列持续更新中-. Activity 的启动模式一共有四种,分别是:standard.singleTop.singleTask.singleInstance .在实 ...

  6. android activity启动模式_Android知识点【Activity】清单文件

    哈喽 好久不见,最近太忙了 请大家原谅 今天我们来说一下android清单文件Activity都有哪些配置,来先上图: 大家一下子看了这么多属性可能觉得有些懵逼,我这边也是就常用的一些数据给大家做一下 ...

  7. android:Activity启动模式

    SingleTask与onNewIntent,onRestart ActivityA 在AndroidManifest.xml中配置launchMode="singleTask", ...

  8. Android初级开发笔记-- activity启动模式的学习(1)

    第一次学习Android中一个很重要的概念,启动模式.文章记录的也只是一些入门知识,随着学习的深入还会有activity启动模式的学习(2)和(3). 下面分三个小点说一下对启动模式的理解区别以及如何 ...

  9. Android中Activity启动模式详解

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...

  10. Android中Activity启动模式

    Android中Activity启动模式一共是四种,这里我写一下我对其的理解: 1.standard(默认) 2.singleTop,如果某个Activity设置了该属性,且当前Activity就是这 ...

最新文章

  1. ValueError: y_true and y_pred contain different number of classes 9, 2. Please provide the true labe
  2. Centos 6.3 x86_64安装与配置bacula
  3. OpenCV运行自定义OCR模型
  4. LRU缓存机制—leetcode146
  5. 使用频繁的正则表达式集合
  6. dockerfile COPY
  7. 挖矿赚加密货币?不如出租GPU计算机获取加倍的利润
  8. VMware虚拟机桥接方式与真实主机共享上网
  9. 数据表 高水位 mysql_Oracle中的高水位(HWM)
  10. Provisioning Services 7.8 入门系列教程之九 手动更新虚拟磁盘
  11. idea swagger生成接口文档_Springboot结合swagger-ui自动生成接口文档
  12. abaqus结果名称
  13. 设计模式 -- Facade
  14. Simulink学习案例2
  15. 前程无忧网站大数据职位信息分析可视化(源码)
  16. php u8t canonical,php – configure:error:utf8_mime2text()具有新的签名,但U8T_CANONICAL缺少...
  17. 今日,华为重磅发布6大创新产品及服务!
  18. 微信小程序-云开发云调用API没有权限(no permission)问题
  19. 虚拟机linux修复grub,日常系统维护之修复linux的grub引导
  20. shell编程发送按键

热门文章

  1. 企业级-Mysql双主互备高可用负载均衡架构(基于GTID主从复制模式)(原创)
  2. Android网络编程系列 一 Socket抽象层
  3. A monad tutorial for Clojure programmers (part 3)
  4. Linux环境编程--文件基本操作
  5. 绑定CPU逻辑核心的利器——taskset
  6. OpenCV查找轮廓
  7. 【C++】模板函数的声明和定义必须在同一个文件中
  8. 【Go】Go基础(七):包
  9. 名图怎么弄云服务器_云服务器购买了宽带的速度怎么测试?
  10. html使用highcharts绘制饼图,html js highcharts绘制圆饼图表