Android | Activity

news2024/11/28 14:52:26

Android Activity

Activity 概念

Activity 是一种包含用户界面、主要用于与用户进行交互的Android应用组件。一个应用程序可以包含零个或多个 Activity

Activity 生命周期

在这里插入图片描述

Activity 类中定义了7个回调方法,覆盖了 Activity 生命周期的每一个环节。

  • onCreate() : 创建,这个方法在 Avtivity 第一次创建时被调用,在这个方法中完成像加载布局、绑定事件等 Activity 的初始化操作。
  • onStart() : 开始,这个方法在 Activity 由不可见变为可见时调用,此时Activity 尚未出现在前台,不能进行交互。
  • onResume() : 活动,这个方法在 Activity 准备好和用户进行交互的时候调用。此时的 Activity 一定位于返回栈的栈顶,并且处于运行状态.
  • onPause() : 暂停,这个方法在系统准备去启动或者恢复另一个 Activity 的时候调用。此时 Activity 仍然可见,但无法交互。我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶 Activity 的使用。
  • onStop() : 停止,这个方法在 Activity 完全不可见的时候调用。它和 onPause() 方法的主要区别在于,如果启动的新 Activity 是一个对话框式的 Activity ,那么 onPause() 方法会得到执行,而 onStop() 方法并不会执行。
  • onDestroy() : 销毁,这个方法在 Activity 被销毁之前调用,之后 Activity 的状态将变为销毁状态。
  • onRestart() : 重启,这个方法在 Activity 由停止状态变为运行状态之前调用,也就是 Activity 被重新启动了。

除了 onRestart 之外的六个方法均是两两相对,按照这种形式可以将 Activity 划分为3种生存期。

  • 完整生存期 :ActivityonCreate() 方法和 onDestroy() 方法之间所经历的就是完整生存期。一般情况下,一个 Activity 会在 onCreate() 方法中完成各种初始化操作,而在 onDestroy() 方法中完成释放内存的操作。
  • 可见生存期 :ActivityonStart() 方法和 onStop() 方法之间所经历的就是可见生存期。在可见生存期内,Activity 对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法合理地管理那些对用户可见的资源。
  • 前台生存期 :ActivityonResume() 方法和 onPause() 方法之间所经历的就是前台生存期。在前台生存期内,Activity 总是处于运行状态,此时的 Activity 是可以和用户进行交互的,我们平时看到和接触最多的就是这个状态下的 Activity

常见的生命周期变化有以下几种,其中Activity A是MainActivity。

  • Activity A 第一次被创建 :onCreate() -> onStart() -> onResume()
  • Activity A 跳转至 Activity B 时,Activity A 的变化:onPause() -> onStop()
  • Activity B 返回 Activity A 时,Activity A 的变化:onRestart() -> onStart() -> onResume()
  • Activity A 打开一没有遮挡全部界面的弹窗,Activity A 的变化:onPause()
  • 将上述弹窗关闭,Activity A 的变化:onResume()
  • Activity A 中按下 BACK 按钮:onPause() -> onStop() -> onDestroy()
  • Activity A 中按下 HOME 按钮,并从桌面再次返回 Activity AonPause() -> onStop() -> onRestart() -> onStart() -> onResume()
  • Activity A 中执行 finish() 方法:onDestroy()

当一个Activity进入了停止状态,是有可能被系统回收,就可能造成上一个页面的临时数据与状态丢失,使用 onSaveInstanceState() 回调方法可以避免这种情况,这个方法可以保证在 Activity 被回收之前一定会被调用。

正常情况下,切换横竖屏后,Activity 会被销毁并重新创建,正常情况下会重新走一遍生命周期:onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()。也可以通过在 AndroidManifest 中配置 android:configChanges = "orientation | screenSize" 来避免重新走一遍生命周期,配置后切屏只会执行 onConfigurationChanged() 方法。

Activity 启动模式

Android中的 Activity 是可以层叠的。我们每启动一个新的 Activity ,就会覆盖在原 Activity 之上,然后点击 BACK 键会销毁最上面的 Activity ,下面的一个 Activity 就会重新显示出来。Android是使用任务 Task 来管理 Activity 的,一个任务就是一组存放在栈里的 Activity 的集合,这个栈也被称作返回栈Back Stack。在默认情况下,每当我们启动了一个新的 Activity ,它就会在返回栈中入栈,并处于栈顶的位置。而每当我们按下 BACK 键或调用 finish() 方法去销毁一个 Activity 时,处于栈顶的 Activity 就会出栈,前一个入栈的 Activity 就会重新处于栈顶的位置。系统总是会显示处于栈顶的 Activity 给用户。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RQYQvbTw-1673797568264)(./image/Android_BackStack.png)]

应该根据特定的需求为每个 Activity 指定恰当的启动模式,共有四种启动模式,可以在 AndroidManifest.xml 中通过给 <activity> 标签指定 android:launchMode 属性来选择启动模式。

  • standard : 默认的启动模式,不显式指定则默认使用。在 standard 模式下,每当启动一个新的 Activity ,它就会在返回栈中入栈,并处于栈顶的位置。对于使用 standard 模式的 Activity,系统不会在乎这个 Activity 是否已经在返回栈中存在,每次启动都会创建一个该 Activity 的新实例,同一个 Activity 可以被实例化多次。
  • singleTop : 如果当前返回栈的顶部不存在该 Activity ,则新建该 Activity 并放入栈顶,所以不再栈顶的 Activity 还是会被多次创建;如果当前返回栈的顶部已存在 Activity 的一个实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent ,不创建该 Activity 的新实例。
  • singleTask : 如果 singleTask 模式指定了不同的 taskAffinity ,会启动一个新的返回栈。假设在 AndroidManifest.xml 中给 <activity> 标签指定 android:taskAffinity="com.android.task" ,如果 com.android.task 返回栈不存在,系统会新建新的返回栈,然后再创建该 Activity A 的实例将其压入返回栈中;如果 com.android.task 返回栈存在,而且返回栈中没有该 Activity A ,则新建 Activity A 并放入栈顶;如果 com.android.task 返回栈存在,而且返回栈中已经有该 Activity A ,则如果发现已经存在该 Activity 则直接使用该实例,并把在这个 Activity 之上的所有其他 Activity 统统出栈,如果没有发现就会创建一个新的 Activity 实例。如果只是指定了 android:taskAffinity 属性,但是启动模式没有指定为 singleTask 模式,新启动的 Activity 依然会在原来的返回栈中。
  • singleInstance : singleTask 的升级版,创建 singleInstance 启动模式的 Activity 时,系统都会直接创建一个新的返回栈并创建 Activity 的新实例置于新 Task 返回栈中。之后系统不会将任何其他 Activity 的实例放入这个新建的 Task 中,该 Activity 始终是其 Task 唯一仅有的成员,一旦该模式的 Activity 实例已经存在于某个栈中,任何应用再激活该 Activity 时都会重用该栈中的实例。

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

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

相关文章

力扣sql基础篇(九)

力扣sql基础篇(九) 1 每位经理的下属员工数量 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 如果是得出来每组都是一个值,就可以在SELECT子句中写非分组字段 # e1.reports_to IS NOT NULL是为了确保是员工,通过员工去找经理 SELECT e2.employee_…

第二章.线性回归以及非线性回归—标准方程法

第二章.线性回归以及非线性回归 2.8 标准方程法 1.公式 1).代价函数&#xff1a; 2).累加平方和用矩阵表示&#xff1a; 2.对(&#x1d466; − &#x1d44b;&#x1d464;)&#x1d447;(&#x1d466; − &#x1d44b;&#x1d464;)求导的两种布局方式&#xff1a; 1).分子…

【初阶数据结构】——写了将近 5 万字,终于把 二叉树 初阶的内容讲清楚了

文章目录前言1. 树的概念及结构1.1 树的概念1.2 树与非树1.3 树的相关概念1.4 树的表示1.5 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09;2. 二叉树概念及结构2.1 概念2.2 现实中的二叉树2.3 特殊的二叉树2.3.1 满二叉树2.3.1 完全二叉树2.4 二叉树的性质…

2022年Tesla技术分享

Autopilot&#xff1a;允许车辆保持车道&#xff0c;跟随前车&#xff0c;弯道减速&#xff0c;等等&#xff0c;处理从停车场到城市街道&#xff0c;再到高速公路的所有驾驶过程。 一、硬件&#xff1a; 8个120W像素的摄像头&#xff0c;每秒36帧&#xff0c;360度空间&#…

牛客竞赛每日俩题 - 动态规划4

目录 经典dp1&#xff08;最长公共序列&#xff09; 经典dp2&#xff08;最长上升子序列 &#xff09; 经典dp&#xff08;最长公共序列&#xff09; 最长公共子序列__牛客网 解析&#xff1a; 有两个字符串T和S&#xff0c;S的长度为n T的长度为m 状态&#xff1a;f[i][j…

C# LINQ查询

一、什么是LINQ LINQ是Language-Integrated Query的缩写&#xff0c;它可以视为一组语言和框架特性的集合。LINQ可以对本地对象集合或远程数据源进行结构化的类型安全的查询操作。LINQ支持查询任何实现了IEnumerable<T>接口的集合类型&#xff0c;无论是数组、列表还是X…

oracle12c数据库安装(静默安装

写在前面 本教程是在Linux下安装oracle12c数据库&#xff0c;由于在有些情况下并没有图形化安装界面&#xff0c;所以这里介绍在linux下通用的安装方式&#xff1a;静默安装&#xff0c;通俗的说就是在linux的命令行窗口安装。 关闭防火墙 systemctl disable firewalld sy…

LeetCode 300. 最长递增子序列

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 300. 最长递增子序列&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetCo…

Spring之AOP简单讲解

目录 一&#xff1a;基本概念 二&#xff1a;案例&#xff1a;模拟AOP的基础代码 三&#xff1a;AOP相关概念 四&#xff1a;AOP入门案例思路分析 五&#xff1a;AOP工作流程 六&#xff1a;AOP核心概念 七&#xff1a;AOP切入点表达式 八&#xff1a;xml方式AOP快速入门…

动态内存分配/管理

目录 1、为什么要有动态内存分配 2、动态内存函数介绍 1、malloc 2、free 3、calloc ​编辑 4、realloc 3、动态内存常见的错误 4、动态内存开辟相关好题 5、c/c程序内存开辟示意图 int a, int arr[10] 是固定地向内存申请连续的一块空间&#xff0c;但不能变长或变…

快速理解机器学习、深度学习与自然语言处理

这篇文章对机器学习、深度学习、自然语言处理进行了简单的介绍&#xff0c;适合快速学习NLP与AI、ML和DL的关系。 机器学习、深度学习、自然语言处理的关系 机器学习、深度学习、自然语言处理的关系如图所示 1 机器学习&#xff08;Machine Learning&#xff09; 机器学习…

python中的设计模式:单例模式、工厂模式

目录 一.设计模式 二.单例模式 二.工厂模式 优点: 总结 一.设计模式 设计模式是一种编程套路&#xff0c;可以极大的方便程序的开发。 最常见、最经典的设计模式,就是我们所学习的面向对象了。 除了面向对象外,在编程中也有很多既定的套路可以方便开发&#xff0c;我们称…

《Linux Shell脚本攻略》学习笔记-第三章

3.1 简介 Unix为所有的设备和系统功能提供了文件形式的借口。可以通过这些特殊文件直接访问设备以及系统功能。 3.2 生成任意大小的文件 创建特定大小的文件最简单的方法就是利用dd命令。dd命令会克隆给定的输出内容&#xff0c;然后将一模一样的一份副本写入输出。 if表示输入…

个人总结:Mysql知识图谱

使用思维导图工具对mysql使用&#xff0c;进行知识总结。着重说下explanid SELECT识别符。这是SELECT查询序列号。这个不重要,查询序号即为sql语句执行的顺序select_type select类型table 输出的行所用的表&#xff0c;这个参数显而易见&#xff0c;容易理解partitions type 连…

Android系统启动(四) — Launcher 启动过程

1 Launcher 概述 系统启动的最后一步是启动一个应用程序来显示系统中已经安装的应用程序&#xff0c;这个应用程序就叫做 Launcher。Launcher 在启动过程中会请求 PackageManagerService 返回系统中已经安装的应用程序信息&#xff0c;并将这些信息封装成一个快捷图标列表显示…

阿里系-淘宝接口抓取及相关问题

阿里系-淘宝接口抓取 一、安装charlse抓包工具 官方下载地址 安装证书 二、安装xposed hook框架 Xponsed简介 具体安装步骤 三、安装模块 关闭阿里系ssl验证 开启http模式 支持支付宝、淘宝、淘宝直播各个接口抓取 四、效果如下 接下去一段时间更新阿里系相关接口 文章目录 一、…

搞技术的要不要学习财务知识

越是大型的集团或者企业&#xff0c;公司里面设立的部门就越多&#xff0c;也越细化&#xff0c;各部门之间既相互独立管理&#xff0c;又是相互的辅助支持&#xff0c;所以在工作中经常遇到这样的一个问题&#xff0c;就是做技术的要不要学习财务知识。这个问题其实就是把技术…

折半查找算法[二分查找法]算法的实现和解决整数溢出问题~

算法实现的要求&#xff1a; 折半查找法又称为二分查找法&#xff0c;这种方法对待查找的列表有两个要求&#xff1a; 1&#xff1a;必须采用顺序存储结构 2&#xff1a;必须按关键字大小有序排列算法思想&#xff1a; 将表中间位置记录的关键字与查找关键字进行比较&#x…

synchronized实现原理

0. 前言 造成线程安全问题的主要诱因有两点&#xff0c;一是存在共享数据(也称临界资源)&#xff0c;二是存在多个线程共同操作共享数据。因此为了解决线程安全问题&#xff0c;我们可能需要这样一个方案&#xff0c;当存在多个线程操作共享数据时&#xff0c;需要保证同一时刻…

ICV:2022年稀释制冷机全球市场规模达2.11亿美元,2028年有望出现突破点

全球前沿科技咨询机构ICV于2023年初发布了稀释制冷机&#xff08;DR&#xff09;的市场分析报告&#xff0c;ICV在报告中表示&#xff0c;2019-2015稀释制冷机的年均增长率达到8.59%以上&#xff0c;且增长率逐年上升。2022年全球稀释制冷机市场规模将达到2.11亿美元&#xff0…