Android 五种启动模式小结

这篇具有很好参考价值的文章主要介绍了Android 五种启动模式小结。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ActivityRecord、TaskRecord、ActivityStack区别

  • ActivityRecord对应着一个Activity实例,保存了Activity所有相关信息

  • TaskRecord指的是一个任务栈,里面包含多个ActivityRecord

  • ActivityStack用于管理TaskRecord

五种启动模式

Standard模式

  • 默认的启动模式,每次启动都会创建新的Activity,运行在启动它的任务栈里

  • taskAffinity:对其无效

SingleTop模式

  • 如果当前任务栈顶部已经有一个Activity了,则不会重新创建,调用它的onNewIntent方法

  • 例如:用于展示通知消息内容的Activity设置为SingleTop,如果当前已经在展示通知消息界面了,则不会重新创建,而是调用onNewIntent去更新界面内容

  • taskAffinity:对其无效

SingleTask模式

  • 启动时会先检查taskAffinity是否和当前任务栈一致(默认是包名),如果不一致会检查是否有同名的任务栈,如果没有就会创建一个新的与taskAffinity同名的任务栈再创建Activity;如果配置的任务栈中已经存在该Activity,则不重新创建,而是调用onNewIntent,并且它上层的Activity会都被清空

  • taskAffinity:只能运行在它配置的任务栈中

  • 同时默认带Intent.FLAG_ACTIVITY_SINGLE_TOP## Intent.FLAG_ACTIVITY_NEW_TASK效果

SingleInstance模式

  • 全局只有一个Activity实例,独占一个任务栈,其他Activity不能进入它所在任务栈,当重新启动该Activity时回调onNewIntent方法

  • 配置taskAffinity和Intent.FLAG_ACTIVITY_SINGLE_TOP## Intent.FLAG_ACTIVITY_NEW_TASK对它都没什么意义,因为它总是独占一个任务栈并且全局唯一

SingleInstancePerTask模式

  • Android 12新增,同时拥有SingleInstance和SingleTask部分特性

  • 只能作为任务栈的根Activity、作为创建该任务栈的第一个Activity运行

  • 每个任务栈最多仅有一个实例

  • 如果当前任务栈没有该Activity实例,则会像SingleInstance一样在新的任务栈启动该Activity

  • 如果当前任务栈已经有该Activity实例,则不会重新创建,并会像SingleTask那样清空它上面的Activity

  • 如果配合Intent.FLAG_ACTIVITY_MULTIPLE_TASK或者FLAG_ACTIVITY_NEW_DOCUMENT启动时,就算当前任务栈已经有该Activity实例了,每次都会在新的任务栈中创建Activity实例

  • Intent.FLAG_ACTIVITY_NEW_TASKtaskAffinity对这个启动模式没有意义,因为它必须在当前任务栈启动的第一个Activity,所以当前任务栈一定跟它的taskAffinity一致,所以加上或者不加上Intent.FLAG_ACTIVITY_NEW_TASK都会复用当前任务栈中的实例

  • 适用于需要在独立的任务栈启动并且拥有SingleTask特性的Activity

taskAffinity

  • 用于指定Activity所在的任务栈

  • 需要配合Intent.FLAG_ACTIVITY_NEW_TASK使用,在启动时会检查是否已经存在taskAffinity同名的任务栈,不存在则会创建

  • 仅对SingleTask有效

allowTaskReparenting

  • 与taskAffinity配合使用,当Activity检测到自己需要的任务栈已经创建,则会移动到taskAffinity指定的任务栈中去

  • 使用场景:当AppA启动AppB的ActivityA时,ActivityA是先存在于AppA任务栈中的,当AppB启动时,ActivityA发现它原本需要的任务栈已经创建,则会移动到AppB任务栈中,所以我们会看到AppB启动时看到的不是主界面,而是ActivityA界面

其他

  • Android 12 以前,当我们处于 Root Activity 时,点击返回键时,应用返回桌面, Activity 执行 onDestroy,程序结束。 Android 12 起同样场景下 Activity 只会 onStop,不再执行 onDestroy。

  • 如果默认启动的Activity设置启动模式为SingleTask或者SingleInstance:打开app,进入第二个界面;返回桌面,重新回到app,显示的是主界面而不是回到桌面前的第二个界面,SingleTask模式是因为启动时会清空上层Activity;而SingleInstance独占一个任务栈,二级界面所在任务栈被切换都后台了

  • 在cmd下运行 adb shell dumpsys activity 查看Activity栈信息

  • 启动模式对应的Int值:文章来源地址https://www.toymoban.com/news/detail-409062.html

    public class ActivityInfo extends ComponentInfo implements Parcelable {
        public static final int LAUNCH_MULTIPLE = 0;
        public static final int LAUNCH_SINGLE_TOP = 1;
        public static final int LAUNCH_SINGLE_TASK = 2;
        public static final int LAUNCH_SINGLE_INSTANCE = 3;
        public static final int LAUNCH_SINGLE_INSTANCE_PER_TASK = 4;
    

到了这里,关于Android 五种启动模式小结的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SpringBoot】 启动后执行方法的五种方式

    在 SpringBoot 工程 启动后, 执行方法的五种方式: 1、实现 CommandLineRunner 接口 项目初始化完毕后,才会调用方法,提供服务 2、实现 ApplicationRunner 接口 同 CommandLineRunner。只是传参格式不一样。CommandLineRunner:没有任何限制;ApplicationRunner:key-value 3、实现 ApplicationListener 接口

    2023年04月08日
    浏览(34)
  • Spark基础【五种运行模式】

    Spark作为一个数据处理框架和计算引擎,被设计在所有常见的集群环境中运行, 在国内工作中主流的环境为Yarn,不过逐渐容器式环境也慢慢流行起来。 容器式环境:发现集群规模不足够,会自动化生成所需要的环境,不需要多余集群机器时,也会自动删除 Spark运行环境 = Jav

    2024年02月01日
    浏览(21)
  • Android Binder小结

    Binder是Android中一种跨进程通信方式,Binder也是一个虚拟设备,对于客户端来说Bidner是一个可以跨进程通信的一个类 Android底层是Linux,但是Linux已有的跨进程通信方式都不能满足Android移动设备的需求,在Android中跨进程通信方式,要求是CS的一对多的架构、需要保证安全,并且

    2023年04月08日
    浏览(27)
  • Android 分享小结

    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 我们继续总结学习,温故知新。 鉴于前阵子有人问到分享相关的功能,说不知道在哪里注册,本文做

    2024年02月05日
    浏览(34)
  • Android 样式小结

    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 我们继续总结学习 Android 基础知识 ,温故知新。 本文讲述样式相关知识 。 样式可以定义界面的格式

    2024年02月05日
    浏览(30)
  • 【C#】五种单例模式详解

    饿汉模式、懒汉模式、双重锁懒汉模式、静态内部类模式、枚举模式。 public class SingleTon1 { private static SingleTon1 instance = new SingleTon1(); } 饿汉式,名字就能看出来,很饿,所以实例在初始化的时候就已经建好了。优点是没有线程安全的问题,缺点是浪费内存空间。 public class S

    2024年02月16日
    浏览(43)
  • 常见的五种设计模式

    https://www.runoob.com/design-pattern/factory-pattern.html **意图:**保证一个类仅有一个实例,并提供一个访问它的全局访问点。 **主要解决:**一个全局使用的类频繁地创建与销毁。 **何时使用:**当您想控制实例数目,节省系统资源的时候。 **如何解决:**判断系统是否已经有这个单例

    2024年02月07日
    浏览(33)
  • 浅析五种 React 组件设计模式

    作为一名 React 开发者,你可能会面临下面几个问题: 如何构建一个高复用度性的组件,使其适应不同的业务场景? 如何构建一个具有简单 API的组件,使其易于使用? 如何构建一个在 UI 和功能方面具有可扩展性的组件? 为解决上述问题,下面介绍五种 React 组件设计模式,

    2024年02月02日
    浏览(29)
  • 【网络编程】五种网络IO模式

    对于一次IO访问(以read为例),数据会 先被拷贝到操作系统内核的缓冲区 中,然后 才会从操作系统内核的缓冲区拷贝到应用程序的地址空间 。所以说,当一个read操作发生时,会经历两个阶段: 1、等待数据准备         2 、将数据从内核拷贝到进程中 linux 系统产生了下面

    2024年02月13日
    浏览(32)
  • Java单例模式详解(五种实现方式)

            Java单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它通常用于需要共享资源或控制某些共享状态的情况下。 例如:         一个日志记录器(Logger)。在一个应用程序中,可能有多个组件需要记录日志,但是我们

    2024年02月13日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包