android 启动模式对应的标志位,Activity的启动模式

一、概述

Android提供了四种启动模式,分别是:

标准模式(Standard)

栈顶复用模式(SingleTop)

栈内复用模式(SingleTask)

单例模式(SingleInstance)

下面依次介绍每种模式的特点,首先了解什么是task,task翻译过来就是“任务”,是一组相互有关联的Activity集合,可以理解为Activity是在task里面活动的。task存在于一个称为back stack的数据结构中,也就是说,task是以 栈的形式去管理Activity的,所以也叫可以称为“任务栈”。综上所述:“任务栈”是Activity的管理方式,采用的是“后进先出”的栈结构,每按一次Back键,就会有一个Activity出栈

二、四种启动模式具体特点

(一)Standard

标准模式,也是系统默认的启动模式,该模式特点:

1、 每启动一次Activity,都会创建一个新的Activity实例在栈顶,不管这个实例在任务栈中是否已经存在。假如 Activity A启动了 Activity B,Activity B则会运行在Activity A所在的任务栈中并处于栈顶位置。

2、 非Activity类型的context(如ApplicationContext)启动standard模式的Activity时会报错。因为非Activity类型 context 并没有任务栈,故无法采用标准模式启动Activity。解决办法可以为待启动Activity指定 FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候系统就会为它创建一个新的任务栈。实际上待启动Activity是采用singleTask模式启动的。

(二)SingleTop

栈顶复用模式,该模式特点:

1、 若需要新建的Activity位于任务栈栈顶,那么此Activity的实例就不会重新创建,而是复用栈顶的实例。调用Activity的onNewIntent()方法不会调用onCreate()和onStart()方法。

2、 假如Activity A启动Activity B,就会判断A所在的任务栈栈顶是否是B的实例。如果是,则不创建新的Activity B 实例而是直接引用栈顶实例,同时onNewIntent()方法会被回调,通过该方法的参数可以取得当前请求的信息;如果不是,则创建新的Activity B实例。

(三)SingleTask

栈内复用模式,该模式特点:

. 查看Activity想要的任务栈是否存在(通过查找Activity的taskAffinity属性值相匹配的任务栈是否存在),若不存在,则新建一个任务栈并创建该Activity实例压入栈中;若存在,则查看Activity是否在该栈中,若在,则将该Activity实例之上的所有Activity实例出栈,使该Activity实例置于栈顶,执行回调函数onNewIntent()方法。若不在,则创建该Activity实例并压入栈中。

1、 taskAffinity是在Androidmanifest文件中的一个重要属性,这个参数标识了一个Activity所需要的任务栈的名字。默认情况下,所有Activity所需的任务栈的名字为应用的包名。taskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用。

4330b3b98468606642a9e885e68ad202.png

(四)SingleInstance

单实例模式,该模式特点:

1、 这个是singleTas模式的加强版,它除了具有singleTask模式的所有特性外,它还有一点独特的特性,那就是此模式的Activity只能单独地位于一个任务栈,不与其 Activity共存于同一个任务栈。

2、 直接创建一个新的任务栈并创建该Activity实例压入栈中。

三、启动模式的设置

两种方法能给Activity指定启动模式:

1、 在AndroidMainifest设置LaunchMode

2、 通过Intent设置标志位Intent Flag

(一)在AndroidMainifest设置LaunchMode

(二)通过Intent设置标志位Intent Flag

常用Activity的标志位Flags有:

标 志 位

作 用

FLAG_ACTIVITY_SINGLE_TOP

指定启动模式为栈顶复用模式(SingleTop)

FLAG_ACTIVITY_CLEAR_TOP

在同一个任务栈中,所有位于它上面的Activity都要出栈。在下面详细介绍下

FLAG_ACTIVITY_NEW_TASK

指定启动模式为栈内复用模式(SingleTask)

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

具有这个标记的Activity不会出现在历史Activity的列表中,即无法通过历史列表回到该Activity中,它等同于在XML中指定Activity 的属性 android:excludeFromRecents=”true”

FLAG_ACTIVITY_CLEAR_TOP

如果该Activity已经在存在任务栈中,系统会将同一个任务栈中,该Activity之上的所有Activity都出栈,然后将Intent发给这个已存在的Activity,该Activity收到Intent之后,执行回调onNewIntent()方法或者自行结束然后重新创建自己。

1、 如果该Activity在AndroidMainifest.xml里将启动模式设置成默认standard模式

6e4ede21f4612149084a3631404cc2ac.png

1、 如果该Activity在AndroidMainifest.xml里将启动模式设置成默认singleTop模式

736f11f3eea1380834d38e0f73411d81.png

1、 如果该Activity在AndroidMainifest.xml里将启动模式设置成默认singleTask模式

f0fc6b167f1000a0a66aad194cb12fee.png

(三)二者的区别

1、 优先级不同:Intent设置方式的优先级 > Manifest设置方式,即以前者为准

2、 限定范围不同Manifest设置方式无法设定FLAG_ACTIVITY_CLEAR_TOP;Intent设置方式无法设置单例模式(SingleInstance)

四、总结

本文介绍了Activity的四种启动模式(standard、singleTop、singleTask、singleNewInstance)和设置启动模式的方法(launchMode、Intent_Flag)

Activity的四种启动模式 Activity启动模式可在项目的配置文件内进行设置 standard:标准模式下每次启动的Activity都会新建,切放到Task任务栈的栈顶,通过点击返回关闭应用的话,就需要返回Activity的新建次数 singleTop:相较于standard模式,singleTop模式下,当新建Activity时,首先会确定该Activity是否在该Task的顶部。如果不在的话才会新建 singleTask: 相较于singleTop模式,singleTask模式下,新建Activity时首先会判断其是否 阅读详情

相关推荐

android studio for android learning (二十五 )activity启动模式详解与标志位简析

1.activity的存储——任务栈也称task栈。任务栈是一种”后进先出”的栈结构,当我们多次启动同一个Activity的时候,系统会创建多个实例并把它们放入任务栈中,每一次back就会有一个Activity出栈,直到栈空为止,当栈中无任何Activity的时候,系统就会回收这个任务栈。2.四种启动模式的定义A. standard:标准模式模式启动模式,每次激活Activity时都会创建Activ

dragon的专栏 995

android 启动模式对应标志位,重温Android四大组件(二)—Activity启动模式标志位...

前言重温 Android 四大组件的第二篇,主要总结Activity启动模式以及相关的标志位Activity启动模式Activity的一个重要的属性,启动模式决定了ActivityActivity栈的存在的行为。不同的启动模式下的Activity有不同的表现,所以开发者需要搞清楚各个启动模式的特性以及相互之间的区别。Activity启动模式standard(标准模式):这是系统默认的启动...

weixin_35762258的博客 554

Android四大组件:Activity详解(二)启动模式与Intent标志位

本文详细介绍了Activity启动模式和Intent标志位,通过实际案例展示了它们在开发中的应用。合理使用这些特性可以优化应用的导航体验,提高内存使用效率。在实际开发中,需要根据具体场景选择合适的启动模式,并注意正确处理Activity的生命周期和数据传递。

Ya-Jun 的博客 393

android 启动模式对应标志位,Android 启动模式

四种启动模式standard(标准模式)singleTop(栈顶复用模式)singleTask(栈内复用模式)singleInstance(单一实例模式)standard标准模式每次开启activity都会创建新的实例,不管这个实例是否已经存在任务栈中,image.png如果在 AndroidManifest.xml 中将 Activity B 的启动模式设置为 Standard,不管任务栈内是否...

weixin_35149268的博客 328

Android flag详解

一.Flag标志位 在阅读源码的时候经常发现有一些标志属性使用一些位操作来判断是否具有该标志,增加标志或者去除标志。 如: 为什么要使用16进制呢?为何不使用十进制0,1,2...?原因是因为这样就可以方便的用位运算来表示共同具有某些属性或者直接判断是否具有某个属性。 上面这句话我们稍微来分析一下。拿文件的权限来分析一下,我们知道文件有三个权限:读,写,执行。分别用4 , 2 , 1来...

xxdw1992的博客 5569

Android内核开发:学会分析系统的启动log

本文是《Android内核开发》系列的第八篇文章,本文主要关注如何分析Android系统的启动log,学会通过搜索重要的TAG标签,找到Android启动过程中的重要节点。要学会分析系统的启动log信息,首先得了解Android系统的启动过程,建议先阅读《Android内核开发:图解Android系统的启动过程》这篇文章,它详细介绍了Android系统的启动过程。其次,你需要知道如何抓取系统启动l...

weixin_34187822的博客 792

重温Android四大组件(二)—Activity启动模式标志位

前言 重温Android四大组件的第二篇,主要总结Activity启动模式以及相关的标志位Activity启动模式Activity的一个重要的属性,启动模式决定了ActivityActivity栈的存在的行为。不同的启动模式下的Activity有不同的表现,所以开发者需要搞清楚各个启动模式的特性以及相互之间的区别。 Activity启动模式 standard(标准模式):这是系统默认的...

weixin_33826268的博客 211

Android进阶————Activit的生命周期和启动模式

activity的几种状态 :7种oncreate 初始化 和setcontentviewonStart 即将可见onresume 完全可见 显示到前台onRestart 从不可见的状态到可见 这里一般是从onstop状态回来的onpause 正在停止 stop前的一点时间 这里不能执行耗时操作 因为会影响其他activity的打开。

wakuwaku0821的博客 665

Android task启动模式,Android 进阶2:Activity 的 Task 与启动模式

Android 中的 Task 是什么我们知道,一个应用中可能有多个 Activity,而这些 Activity 被以栈的形式管理。当我们新打开 Activity 或者者按返回时,会导致 Activity 的入栈/出栈。[图片上传失败...(image-b73788-1548163287120)]有时候我们要进行少量跨应用的操作,比方拍照、P 图、分享到朋友圈,这一系列操作中会有多个应用的 Act...

weixin_42524499的博客 364

activity总结

主题样式 主题Theme就是用来设置界面UI风格,可以设置整个应用或者某个活动Activity的界面风格。在Android SDK中内置了下面的Theme,可以按标题栏Title Bar和状态栏Status Bar是否可见来分类: activity的声明周期,在activity内弹出dialog和切换fragment,此时activty的生命周期不会变化; Activ...

haiyang497661292的博客 607

Android中四大组件之一的Activity启动模式

standard:默认模式,每次新建实例,适合普通页面;singleTop:栈顶复用,避免栈顶重复创建,适合通知 / 搜索页面;singleTask:栈内单例,清理上方页面,适合应用核心页面(如首页);:全局单例 + 独立栈,仅用于系统级 / 强隔离页面,极少使用。核心原则:根据页面的 “复用需求” 和 “任务栈隔离需求” 选择启动模式,优先使用 standard/singleTop/singleTask,避免滥用 singleInstance。

weixin_39789947的博客 1241

Activity启动模式、任务栈以及标志位

上两篇讲完了Activity的生命周期的情况,接下来我们继续揭秘Activity其他神秘的面纱,首先我们先来看看关于Activity启动模式。 在讲解Activity启动模式之前,我们先来设想一个场景:每当我们启动一个Activity的时候,系统会自动帮我们在当前Activity所属的任务栈里面创建这个Activity并置入栈中,多点几次则系统会自动创建几个,这样的设计里面好像有点傻傻的,因为很多时候我们并不想重复创建,只想要一个能够反复调用。为了解决这个问题,系统推出了Activity启动模式来解决

zhoufan11132的博客 605

androidActivity启动模式

本文参考自: ①《Android开发艺术探索》 ②Android Developers:https://developer.android.google.cn/guide/components/activities/tasks-and-back-stack Android Activity启动模式共有4种:standard(默认模式)、singleTop、singleTask和sin...

李加华的专栏 407

Activity启动模式

Activity启动模式 四种启动模式 1.standard 标准模式 **应用场景:**一般界面都是这个模式 这是Activity默认的启动模式,在每次启动的时候都会创建一个新的activity实例(不管这个实例之前是否被创建)。被创建实例的生命周期符合典型情况下的activity的生命周期。在这种模式下,谁启动了这个 Activity 那么这个 Activity 就运行在启动它的那个 Activity 所在的栈中。当非activity类型的context来使用这种模式来启动activity就会报错:

qq_52353404的博客 2313

Android 进阶二:Activity 的 Task 与启动模式

有时候我们要进行一些跨应用的操作,比如拍照、P 图、分享到朋友圈,这一系列操作中会有多个应用的 Activity 互相调用,安卓系统是如何管理这些不同应用的 Activity 的呢?如果应用 Task 不存在(应用最近未曾使用),则会创建一个新 Task,并且该应用的“主”Activity 将作为堆栈中的根 Activity 打开。当用户触摸应用启动器中的图标(或主屏幕上的快捷方式)时,该应用的 Task 将出现在前台。反应在界面上,当我们点击第三个导航菜单按钮,出现在列表中的就是一个个 Task。

Misdirection_XG的博客 1060

Android——Activity的四种启动模式

简介: 我们一个程序会存在不同的Activity,也会存在许多实例,这些实例就会进入任务栈中,任务栈采用“后进先出”的算法,例如:我们使用手机,打开QQ,在QQ界面进入一个聊天界面,此时存在两个Activity实例,假设我们按一下back键我们将回到QQ主界面,在按一下back键我们将回到屏幕主界面,这就是“后进先出”。 Activity的四种启动模式 standard:系统默认使用此启动模式,特性:无论实例存在与否,每启动一次就创建一个实例,如下图所示 singleTop:此启动方法分为两种情况。 一

FranzLiszt的博客 2448
上一篇: html语言属于web程序设计,web程序设计复习题
下一篇: html radio选中状态,js表单元素checked、radio被选中的几种方法(详解)
是辣翻天根根香啊
博客等级 码龄7年 19粉丝 59原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值