当前位置: 首页 > news >正文

Android基础之Activity生命周期

Activity是Android四大组件之一、称为之首也恰如其分。

Activity直接翻译为中文叫活动。在Android系统中Activity就是我看到的一个完整的界面。

界面中看到的TextView(文字)、Button(按钮)、ImageView(图片)都是需要Activity来承载的。

总结一句话,Activity负责界面的呈现和用户的交互。

接下来看下Activity的基础---生命周期。何为声明周期--就是一个Activity从创建到销毁的整个过程。

这一过程有几个很重要的生命周期方法,是必须要掌握的。Activity的创建和声明周期的管理,都是交给系统的ActivityManagerService进行管理的。AMS相关的知识随着课程的深入会逐步讲解。

现在看下Activity基础,生命周期

Activity一个完整的生命周期,通过starActivity()创建到调用finish()方法销毁,会执行6个周期函数。

startActivity创建执行的生命周期函数是:

当Activity退出被销毁时执行的生命周期函数:

 通常我们在onCreate中作初始化的工作,初始化View,设置监听等准备工作。

onResume被调用时,Activity就正常显示到屏幕上了。

当Activity被销毁时,在onDestory中做释放资源的工作,防止内存泄漏的发生。

如果在当前Activity开启一个新的Activity,然后又退出新的Activity后又回到前一个Activity,他的生命周期函数是哪样的?

开启新的Activity,会调用前一个Activity的onPause onStop方法。回到前一个Activity时,会调用onRestart、onStart、onResume方法。

如果在当前Activity开启一个新的Activity,然后又退出新的Activity后又回到前一个Activity,那么他们两个的生命周期函数又分别是哪样的呢?

从以上生命周期函数执行的顺序可以看出,无论是开启新的NewActivity,还是回到原来的MainActivity,都会先调用当前Activity的onPasue方法,然后执行另外一个Activity的生命周期函数,直到onResume方法被调用,然后再执行原来Activity未完成的生命周期函数。

这些生命周期函数的调用,都是受ActivityManagerService管理调度的。他们系统为啥要这样做呢?思考一下。

绍屏幕旋转时,Activity生命周期函数的调用过程。

正常创建执行的生命周期函数:

竖屏切换横屏时:

横屏再切换为竖屏时 :

 从log中可以看出横竖屏切换时,会发生Activity的重建。并且调用了onSaveInstanceState和onRestoreInstanceState两个函数。从名字可以看出来,一个是保存实例状态,另外一个是恢复实例状态。这两个函数的目的就是为了在发生Activity重建时,可以恢复想要保存的数据。

但是在实际的项目开发中,很少用到。因为我可以通过一些参数的配置,来告诉系统屏幕发生旋转时,不要进行Activity的重建。

禁止屏幕旋转时Activity重建:

在Activity对应的标签下配置:android:configChanges="orientation|screenSize"

添加了上面的配置,屏幕旋转时就不会发生Activity重建,系统会回调onConfigurationChanged。

在这个方法中,我们可以知道现在屏幕是处于横屏还是竖屏。这个在实际的开发中是用到的,比如一些游戏app和视频播放类app,要跟随屏幕的旋转发生界面的变化。

 orientation,中文意思方向。可以通过newConfig拿到一些相关数据。

1位竖屏,2位横屏

 拓展:

1)我们可以通过onSaveInstanceState和onRestoreInstanceState,进行数据的保存和恢复。

这两个函数都有AMS回调的,之后的文章会介绍AMS回调的时机,从源码角度来搞明白,系统是怎么做的。

2)数据持久化,可以通Jetpack中的ViewModel实现,实现的方式和原理,在后面的文章中会做介绍。

 

相关文章:

Android基础之Activity生命周期

Activity是Android四大组件之一、称为之首也恰如其分。 Activity直接翻译为中文叫活动。在Android系统中Activity就是我看到的一个完整的界面。 界面中看到的TextView(文字)、Button(按钮)、ImageView(图片)都是需要Activity来承载的。 总…...

Golang 程序漏洞检测利器 govulncheck(一):安装和使用方法

govulncheck 是什么? govulncheck 是一个命令行工具,可以帮助 Golang 开发者快速找到项目代码和依赖的模块中的安全漏洞。该工具可以分析源代码和二进制文件,识别代码中对这些漏洞的任何直接或间接调用。 默认情况下,govulnchec…...

强化学习算法总结 2

强化学习算法总结 2 4.动态规划 待解决问题分解成若干个子问题,先求解子问题,然后得到目标问题的解 需要知道整个状态转移函数和价值函数,状态空间离散且有限 策略迭代: 策略评估:贝尔曼期望方程来得到一个策略的 V ( s ) V(s…...

修改node_modules避免更新覆盖 patch-package

说明:直接修改第三方库的代码,会带来团队协作的问题,使用patch-package生成补丁包 什么是 patch-package? patch-package 是一个基于 Git 的工具,它可以帮助我们对依赖包进行修复补丁。通过创建一个与问题相关的补丁文…...

Elasticsearch安装,Springboot整合Elasticsearch详细教程

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够实现近乎实时的搜索。 Elasticsearch官网https://www.elastic.co/cn/ 这篇文章主要简单介绍一下Elasticsearch,Elasticsearch的java API博主也在学习中,文章会持续更新~ …...

OJ题库:计算日期到天数转换、打印从1到最大的n位数 、尼科彻斯定理

前言:在部分大厂笔试时经常会使用OJ题目,这里对《华为机试》和《剑指offer》中的部分题目进行思路分析和讲解,希望对各位读者有所帮助。 题目来自牛客网,欢迎各位积极挑战: HJ73:计算日期到天数转换_牛客网 JZ17:打印…...

混合动力汽车耐久测试

一 背景 整车厂可通过发动机和电机驱动的结合为多款车型提供混合动力驱动技术。汽车集成电机驱动可大大减少二氧化碳的排放,不仅如此,全电动驱动或混合动力驱动的汽车还将使用户体验到更好的驾驶感受,且这种汽车可通过电动机来实现更快的加速…...

useRef 定义的 ref 在控制台可以打印但是页面不生效?

useRef 是一个 React Hook,它能让你引用一个不需要渲染的值。 点击计时器 点击按钮后在控制台可以打印但是页面不生效。 useRef 返回的值在函数组件中不会自动触发重新渲染,所以控制台可以显示变化而按钮上无法显示 ref.current的变化。 import { use…...

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,动态数组(重点推荐))七(129)

需求:前端根据后端的返回数据:画统计图; 说明: 1.X轴为地域,Y轴为地域出现的次数; 2. 动态展示(有地域展示,没有不展示,且高低排序) Demo案例: …...

Cell Reports | 揭开METTL14在介导m6A修饰中的神秘面纱

m6A被认为是最丰富的mRNA修饰,广泛分布在大多数真核生物中,包括哺乳动物、植物、昆虫、酵母和某些病毒。m6A修饰的沉积和去除之间的动态平衡对于正常的生物过程和发育至关重要,如失调通常与癌症等疾病有关。m6A修饰由m6A甲基转移酶复合物&…...

297. 二叉树的序列化与反序列化

题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序…...

肖sir__设计测试用例方法之边界值03_(黑盒测试)

设计测试用例方法之边界值 边界点定义 上点:边界上的点 离点:离上点最近的点(即上点左右两边最邻近的点) 内点:在域范围内的点 案例:qq号:5-12位 闭区间: 离点:5 位 &…...

功能测试常用的测试用例大全

登录、添加、删除、查询模块是我们经常遇到的,这些模块的测试点该如何考虑 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求,密码不符合要求(格式上的要求) ④ 密码符合要求,…...

css利用flex分配剩余高度出现子组件溢出问题

1.利用flex分配剩余高度/宽度 情景:父组件高度一定,子组件中,其他子组件高度固定,一个子组件高度不确定(页面滚动列表) .father{display: flex;flex-direction: column;.son1{height: 200px;}.son2{//或 …...

Java中的网络编程------基于Socket的TCP编程和基于UDP的网络编程,netstat指令

Socket 在Java中,Socket是一种用于网络通信的编程接口,它允许不同计算机之间的程序进行数据交换和通信。Socket使得网络应用程序能够通过TCP或UDP协议在不同主机之间建立连接、发送数据和接收数据。以下是Socket的基本介绍: Socket类型&…...

【【STM32-29正点原子版本串口发送传输实验】

STM32-29正点原子版本串口发送传输实验 通过串口接收或发送一个字符 例程目的 开发板上我们接入的是实现异步通信的UART接口 USB转串口原理图 我们一步步分析 PA9是串口1 的发送引脚 PA10是串口1 的接受引脚 。因为我们现在只是用到异步收发器功能,所以我们现…...

【面试题精讲】什么是websocket?如何与前端通信?

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 什么是WebSocket? WebSocket是一种在Web应用程序中实现双向通信的协议。它允许在客户端和服务器之间建立持久…...

unity tolua热更新框架教程(2)

Lua启动流程 增加脚本luamain,继承luaclient 建立第一个场景GameMain,在对象GameMain挂载脚本LuaMain,启动场景 看到打印,lua被成功加载 lua入口及调用堆栈 这里会执行main.lua文件的main函数 C#接口导出 在此处配置C#导出的代码 …...

【0904作业】QT 完成登陆界面跳转到聊天室+完成学生管理系统的查找和删除功能

一、完成登陆界面跳转到聊天室 1> 项目结构 2> 源码 ① .pro ②main #include "mywnd.h" #include"chatCli.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MyWnd w;w.show();Form f;QObject::co…...

ceph源码阅读 buffer

ceph::buffer是ceph非常底层的实现&#xff0c;负责管理ceph的内存。ceph::buffer的设计较为复杂&#xff0c;但本身没有任何内容&#xff0c;主要包含buffer::list、buffer::ptr、buffer::hash。这三个类都定义在src/include/buffer.h和src/common/http://buffer.cc中。 buffe…...

手把手教你用Verilog在FPGA上实现Sobel边缘检测(附完整Matlab图片转TXT流程)

从图像到硬件加速&#xff1a;FPGA实现Sobel边缘检测全流程实战指南 在计算机视觉领域&#xff0c;边缘检测作为基础预处理步骤&#xff0c;直接影响着后续特征提取和目标识别的精度。传统基于CPU的算法实现往往难以满足实时性要求&#xff0c;而FPGA凭借其并行计算能力和低延迟…...

工业网络零中断的秘密:手把手教你理解并配置PRP协议(基于IEC 62439-3)

工业网络零中断的秘密&#xff1a;手把手教你理解并配置PRP协议&#xff08;基于IEC 62439-3&#xff09; 在钢铁厂轧机轰鸣的生产线上&#xff0c;或是高铁信号控制系统的毫秒级响应中&#xff0c;任何网络中断都意味着数百万损失甚至安全事故。传统冗余技术如RSTP需要秒级收敛…...

QR码扫描模块全解析:从原理到工程实践

1. 项目概述&#xff1a;不只是“扫一扫”那么简单如果你以为QR码扫描就是个“打开摄像头、对准、识别”的简单功能&#xff0c;那可能错过了它背后一整套精密的技术栈和丰富的应用场景。作为一个在移动应用和嵌入式设备领域折腾了十多年的老码农&#xff0c;我见过太多项目在集…...

终极跨平台KVM解决方案:3分钟掌握Input Leap键盘鼠标共享

终极跨平台KVM解决方案&#xff1a;3分钟掌握Input Leap键盘鼠标共享 【免费下载链接】input-leap Open-source KVM software 项目地址: https://gitcode.com/gh_mirrors/in/input-leap 还在为多台电脑设备间频繁切换键盘鼠标而烦恼吗&#xff1f;Input Leap跨平台KVM软…...

Codex SQL迁移终极指南:数据库架构变更的自动化革命

Codex SQL迁移终极指南&#xff1a;数据库架构变更的自动化革命 在当今快速迭代的软件开发环境中&#xff0c;数据库架构变更是每个开发团队都必须面对的挑战。传统的手动SQL迁移过程不仅耗时耗力&#xff0c;还容易出错。Codex作为一款革命性的聊天驱动开发工具&#xff0c;通…...

LabVIEW 32位版如何调用Halcon 17.12的.NET库?手把手教你打通图像处理流程

LabVIEW 32位版与Halcon 17.12 .NET库深度兼容指南&#xff1a;从原理到实战 在工业视觉和自动化测试领域&#xff0c;LabVIEW与Halcon的组合堪称黄金搭档。但当我们试图在32位LabVIEW环境中调用Halcon 17.12的.NET库时&#xff0c;常常会遇到各种"拦路虎"——从神秘…...

告别智能插座!用Python和nilmtk库,5分钟入门非侵入式用电分析

告别智能插座&#xff01;用Python和nilmtk库&#xff0c;5分钟入门非侵入式用电分析 你是否曾好奇家中每台电器究竟消耗了多少电量&#xff1f;传统方案需要在每个插座安装智能电表&#xff0c;成本高昂且部署复杂。现在&#xff0c;借助**非侵入式负载监控&#xff08;NILM&…...

为GitHub开源项目配置统一的大模型调用与成本管控方案

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为GitHub开源项目配置统一的大模型调用与成本管控方案 对于开源项目的维护者而言&#xff0c;为项目集成AI能力正变得越来越普遍。…...

实习生,企业的青春代言人

为什么优质的口碑是招募最好的助推器&#xff1f; 在校园招聘中&#xff0c;应届生们不仅看官网的宣传&#xff0c;更看重学长学姐的“真实评价”。一份优质的校招实习经历&#xff0c;不仅能为企业培养出未来的中坚力量&#xff0c;更能通过学生的自发传播&#xff0c;让实习…...

如何高效设计无刷直流电机控制器:Simscape Electrical完整解决方案指南

如何高效设计无刷直流电机控制器&#xff1a;Simscape Electrical完整解决方案指南 【免费下载链接】Design-motor-controllers-with-Simscape-Electrical This repository contains MATLAB and Simulink files used in the "How to design motor controllers using Simsc…...