Activity的启动模式

news2024/12/23 17:35:50

文章目录

  • Activity的启动模式
    • standard
    • singleTop
    • singleTask
    • singleInstance

Activity的启动模式

  • 在实际的项目当中,我们应该根据特定的需求给每个Avtivity指定恰当的启动模式
  • 启动模式一共包含四种:standard,singleTop,singleTask,singleInstance
  • 指定启动模式的方法:在AndroidManifest.xml中通过标签指定android:launchMode属性来选择相应的启动模式.

standard

  • standard是Activity默认的启动模式
  • 在standard启动模式下,每当启动一个新的Activity就会在返回栈当中入栈,并且处在栈顶的位置.
  • 对于使用standard启动模式的Activity,系统不会在乎返回栈中是否存在这个Activity,每次启动都会创建一个该Activity的实例
  • 体会一下standard启动模式
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("FirstActivity", this.toString())
        setContentView(R.layout.first_layout)
        button1.setOnClickListener {
            val intent = Intent(this, FirstActivity::class.java)
            startActivity(intent)
        }
    }
  • 这段代码是在FirstActivity中调用FirstActivity,通过测试可以发现每次点击按钮都会创建一个新的Activity实例.
  • standard模式原理运行图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJqFIOc2-1669222666256)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221124000616313.png)]

singleTop

  • 在有些时候,standard会显得不太合理,因为明明栈顶已经存在相应的实例了,我们应该直接复用即可,可是standard不管三七二十先创建新的实例.
  • 针对这一点,singleTop做了优化,当返回栈的栈顶是我们需要创建的实例的时候,那么则认为可以直接使用它.不会再创建新的Activity实例.
  • 在AndroidManifest.xml中修改Activity的启动模式
        <activity
            android:name=".FirstActivity"
            android:exported="true"
            android:label="This is FirstActivity"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
  • android:launchMode="singleTop"来指定Activity的启动模式
  • 此时我们再点击按钮,无论点击多少次,都只会创建一个FirstActivity的实例,仅按一次返回键就可以退出程序
  • 不过当FirstActivity并未处在栈顶的时候,再启动FirstActivity还是会创建新的实例.
  • singleTop的原理模式图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dd6BSPnd-1669222666258)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221124001952406.png)]

singleTask

  • 使用singleTop可以很好的解决重复创建栈顶的Activity的问题,但是当Activity并没有处在栈顶的时候就还是会存在重复创建Activity的情况.
  • 那么此时singleTask就是用来保证某个Activity在程序的上下文中只存在一个实例.
  • 当Activity的启动模式指定为singleTask的时候,每次启动Activity的时候,系统首先会在返回栈中检查是否存在该Activity的实例,如果存在,就将这个Activity之上的所有Activity进行出栈,如果没有发现存在该Activity的实例,那么就会创建一个该Activity的实例.

singleInstance

  • singleInstance是四种启动模式当中最特殊也是最复杂的一个.
  • 指定为singleInstance启动模式的Activity会启动一个新的返回栈来管理这个Activity
  • 当我们的Activity是多个程序程序所共享的时候,就应该需要用到这种启动模式,因为其他三种的启动模式都是自己独有的返回栈来管理Activity,所以不能将一个Activity进行共享.
  • 实践singleInstance
<!--在AndroidManifest.xml中修改SecondActivity的启动模式-->
        <activity
            android:name=".SecondActivity"
            android:exported="false"
            android:launchMode="singleInstance">
            <intent-filter>
                <action android:name="com.zb.activitytest.ACTION_START" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.MY_CATEGORY" />
            </intent-filter>
        </activity>
  • 修改FirstActivity中的代码
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //在onCreate方法中打印返回栈的id
        Log.d("FirstActivity", "This is $taskId")
        setContentView(R.layout.first_layout)
        //启动ThirdActivity
            val intent = Intent(this, SecondActivity::class.java)
            startActivity(intent)
        }
    }
  • 修改SecondActivity中的代码
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("SecondActivity", "Task id is $taskId")
        setContentView(R.layout.second_layout)
        button2.setOnClickListener {
            val intent = Intent(this, ThirdActivity::class.java)
            startActivity(intent)
        }
    }
  • 修改ThirdActivity中的代码
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("ThirdActivity", "Task id is $taskId")
        setContentView(R.layout.third_layout)
    }
  • 运行代码,依次点击按钮,通过打印的日志发现FirstActivity和ThirdActivity的task id是一样的,但是SecondActivity的task id是不同于其他两个
  • 这个说明SecondActivity确实是存在于一个单独的返回栈当中的,而且在这个栈当中只存在SecondActivity这一个Activity

在这里插入图片描述

  • singleInstance模式原理如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q2pbRM84-1669222666261)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221124005500093.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SELECT 1 FROM DUAL ,未找到要求的 FROM 关键字

1. 解决方案 背景描述&#xff1a; 项目需要将mysql数据库换成Oracle数据库&#xff0c;配置好数据源后&#xff0c;启动报错&#xff1a; 解决方案&#xff1a; application.yml 中修改&#xff08;配置了多数据源&#xff09;&#xff1a; spring:datasource:dynamic:dr…

web前端网页制作课作业:使用HTML+CSS技术制作中华传统文化网站【文房四宝】学生网页设计作品 简单静态HTML网页作品

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Linux上:安装、网络配置

文章目录第一章&#xff1a; Linux概述1.1 操作系统1.2 操作系统的发展史1.3 Linux发行版第二章WSL安装linux2.1 WSL简介2.2安装Ubuntu2.3 Ubuntu功能设置2.4 ubantu环境设置第三章&#xff1a; 使用VM安装Linux3.1安装VMware3.2 配置安装系统环境3.3 安装Centos系统3.4 基本配…

C++入门基础05:表达式(表达式基础、算术运算符与赋值运算符、逻辑关系运算符、成员访问运算符与条件运算符、位运算符、移位运算符与类型转换)

C入门基础05&#xff1a;表达式(表达式基础、算术运算符与赋值运算符、逻辑关系运算符、成员访问运算符与条件运算符、位运算符、移位运算符与类型转换) 一、表达式基础 #include <iostream> //系统定义头文件一般是尖括号 #include<fstream> #include<string…

Linux从入门到精通(九)——Linux编程

文章篇幅较长&#xff0c;建议先收藏&#xff0c;防止迷路 文章跳转Linux从入门到精通&#xff08;八&#xff09;——Linux磁盘管理goLinux从入门到精通&#xff08;九&#xff09;——Linux编程goLinux从入门到精通&#xff08;十&#xff09;——进程管理goLinux从入门到精…

教程一 Energy 构建简单的Windows、Linux、MacOSX桌面应用

Golang的Energy使用命令行工具安装开发环境&#xff0c;并运行一个应用。 环境安装 Energy 命令行工具 使用命令行工具自动安装Energy框架的所有依赖(CEF)&#xff0c;支持Window、Linux、MacOSX 安装过程从网络下载CEF和Energy库 获取命令行工具 一、预编译命令行工具 下载地…

银行业国产数据库现状

数据库发展历程 数据库经历了单机数据库、集中式数据库、非关系型数据库、新型数据库四阶段。 单机数据库&#xff1a;单机数据库就是只能运行在单机上&#xff0c;不提供网络功能的数据库。 集中式数据库&#xff1a;数据库是一种经典、传统的数据库结构&#xff0c;多台机…

js内容整理

js内容整理 定时器 JavaScript 提供定时执行代码的功能&#xff0c;叫做定时器&#xff08;timer&#xff09;&#xff0c;主要由setTimeout()和setInterval()这两个函数来完成。 setTimeout() setTimeout函数用来指定某个函数或某段代码&#xff0c;在多少毫秒之后执行。它…

公益是书籍是什么,公益书籍变现模式有哪些

最近&#xff0c;我看到很多人在朋友圈里做公益书籍。 什么是公益书籍&#xff0c;公益书籍又是怎么进行变现的呢&#xff1f; 公益书籍主要是借助公益的逻辑&#xff0c;分发给各种家长。家长每次根据书单给孩子选择相应的书&#xff0c;15元左右就能拿到一套。 公益书籍实…

Linux进程地址空间

哪有明知明天会死今天就会上吊的傻瓜&#xff1f; -要乐观喔 本次博客的分享呢可能比较抽象&#xff0c;博主尽力画图分析&#xff0c;力图给老铁阐明清楚。 目录 ⚽一、进程地址空间区域划分 &#x1f453;Ⅰ区域划分 &#x1f453;Ⅱ虚拟地址和物理地址 ⚽二、页表和映…

科技云报道:发布分布式云战略,中国电子云吹响冲锋号角

科技云报道原创。 过去三年&#xff0c;中国电子云一直牢牢抓住业界的目光&#xff0c;不仅因为“国家队”的身份光环&#xff0c;更因实打实的成绩令人侧目。 据悉&#xff0c;中国电子云核心产品中心云CECSTACK&#xff0c;起步可达3000节点规模&#xff0c;最大可支撑每秒…

一文搞懂堆外内存(模拟内存泄漏)

一、前言 平时编程时&#xff0c;在 Java 中创建对象&#xff0c;实际上是在堆上划分了一块区域&#xff0c;这个区域叫堆内内存。 使用这 -Xms -Xmx 来指定新生代和老年代空间大小的初始值和最大值&#xff0c;这初始值和最大值也被称为 Java 堆的大小&#xff0c;即 堆内内…

2022亚太C题赛题分享

是否全球变暖&#xff1f; 加拿大的49.6C创造了地球北纬50以上地区的气温新纪录&#xff0c;一周内数百人死于高温&#xff1b;美国加利福尼亚州死亡谷是54.4C&#xff0c;这是有史以来地球上记录的最高温度&#xff1b;科威特53.5C&#xff0c;甚至在阳光下超过70多个C&#x…

模板进阶模板分离编译的问题与解决

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、模板参数1.非类型模板参数比如库中的array2.类型模板参数二、模板参数的特化1.全特化2.偏特化&#xff08;半特化&#xff09;三、模板的…

RTSP 和 RTMP原理 通过ffmpeg实现将本地摄像头推流到RTSP服务器

RTSP 和 RTMP原理 & 通过ffmpeg实现将本地摄像头推流到RTSP服务器 文章目录RTSP 和 RTMP原理 & 通过ffmpeg实现将本地摄像头推流到RTSP服务器一、流媒体&#xff1a;RTSP 和 RTMP0、参考资料1、RTSP 和 RTMP的工作原理1&#xff09;RTSP工作原理2&#xff09;RTMP工作原…

计算机组成原理期末复习第三章-3(唐朔飞)

计算机组成原理期末复习第三章-3&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&am…

C树和森林的研究学习随记【一】

文章目录树与森林树结构初识树基本的相关概念森林二叉树(Binary Tree)满二叉树【饱满】完全二叉树【少了叶子的满二叉树】总结树和森林的转换快速转换技巧森林转化为二叉树分辨二叉树的五大性质树与森林 树是一种的数据结构。顾名思义&#xff0c;类似于我们生活中的树一样。【…

C++11标准模板(STL)- 算法(std::stable_sort)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 将范围内的元素排序&#…

m基于Simulink的高速跳频通信系统抗干扰性能分析

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 信道为Rayleigh衰落信道下的性能分析和Nakagami-m衰落信道下的性能分析。本课题我们采用的仿真参数如下&#xff1a; simulink仿真模型如下所示&#xff1a; 跳频是最常用的扩频方式之一…

Hadoop笔记-01概述

文章目录1 什么是大数据&#xff1f;1.1 大数据计算模式及代表产品1.2 云计算与物联网1.2.1 云计算1.2.1.1 虚拟化1.2.1.2 分布式存储1.2.1.3 分布式计算1.2.1.4 多租户1.3 物联网1.3.1 识别和感知技术1.3.2 网络与通信技术1.3.3 数据挖掘与融合技术1.4 大数据与云计算、物联网…