Android开发Activity生命周期详解

本文详解Android开发Activity生命周期。

目录

一、Activity

二、Activity生命周期

三、生命周期特性

四、常见情况生命周期的执行顺序


一、Activity

Activity是用户交互的第一接口,它提供了一个用户完成指令的窗口。当开发者创建Activity之后,通过setContentView(View)方法来给该Activity指定一个显示的界面,并以为基础提供给用户交互的接口。系统采用Activity栈的方式来管理Activity。

Activity由任务栈管理。启动一个新的Activity后,该Activity将被加入到任务栈栈顶,之前的Activity位于此Activity底部。

 Activity一个最大的特点就是拥有多种形态,它可以在多种形态间进行切换,以此来控制自己的生命周期。

Acitivity一般有四种状态:

①运行状态: Activity位于栈顶,此时正好处于屏幕最前方。(可见可交互)

②暂停状态:Activity失去了焦点,但仍然对用户可见(如栈顶的Activity是透明的或栈顶Activity并不是铺满整个手机屏幕)。可以在极低内存情况下被系统杀死。(可见不可交互)

③停止状态:当Activity被其他Activity完全遮挡,此时此Activity对用户不可见。它仍然保留所有状态和成员信息,但是它不再对用户可见,因此其窗口被隐藏,并且当其他地方需要内存时,它通常会被系统杀死。(不可见,不可交互)

④销毁状态:如果Activity在栈区中被移除后,当它再次显示给用户时必须完全重新启动并恢复到之前的状态。

在每个不同的状态阶段,Android系统会对Activity内相应的方法进行回调。因此写Activity时一般都是继承Activity类并重写相应的回调方法。

二、Activity生命周期

onCreate:创建活动。把页面布局加载进内存,进入了初始状态。

onStart:开始活动。把活动页面显示在屏幕上,进入了就绪状态。

onResume:恢复活动。活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击

动作、允许用户输入文字等等。

onPause:暂停活动。页面进入暂停状态,无法与用户正常交互

onStop:停止活动。页面将不在屏幕上显示。

onDestroy:销毁活动。回收活动占用的系统资源,把页面从内存中清除。

onRestart:重启活动。重新加载内存中的页面数据

onNewIntent:重用已有的活动实例。

三、生命周期特性

onCreate

特性:

onCreate是Activity创建时的第一个生命周期,并且只会执行一次

onCreate执行时Activity处于不可见状态

在这个方法中我们会初始化当前布局setContentLayout()方法

onCreate执行时Activity的View并没有测量尺寸绘制,这个时候View的宽高值为0。

建议:

不建议进行耗时初始化

建议只需要进行只需要一次初始化的View的初始化,比如View的初始化,对话框的初始化,ViewModel的初始化

获取Intent里传入的值

onStart

特性:

onCreate()方法完成后,此时activity进入onStart()方法

当前activity是用户可见状态,但没有焦点,与用户不能交互,一般可在当前方法做一些动画的初始化操作。

可以被onRestart重新调用

建议:

不建议进行耗时初始化

View的动画初始化与开启

一些需要在后台暂停后又重新恢复的初始化,比如一些包含操作View的Handler的重新初始化

视频播放与相机拍照等等功能的重新初始化(比如:Camera2、VideoView)

onResume

特性:

onStart()方法完成之后,此时activity进入onResume()方法中

当前activity状态属于运行状态 (Running),可与用户进行交互

建议:

在重新运行onResume情况下,可以考虑重新恢复视频播放,注意只是将暂停播放的视频后的重新恢复。并不是重新初始化视频播放组件

可以考虑Camera预览可以在这里开启。

在重新运行onResume情况下,恢复Camera预览。

可以考虑动画在这里开启。

在重新运行onResume情况下,恢复一些动画View的动画效果。

在重新运行onResume情况下,恢复需要与操作View有关的Callback或者Listener。

进行超级耗时的初始化与加载,建议显示一个等待对话框。这样页面已经显示了,用户也能看到等待对话框。(但是,因为onResume容易反复调用需要注意需要利用onRestart生命周期做好判断,防止已经初始化过的资源,进行反复耗时初始化)

onPause

特性:

Activity在不在前台时,比如一个Dialog模式的Activity启动后,处于背景半透明置灰的情况的这个Activity也会触发onPause

注意!onPause触发时,Activity可能处于瞬间可见状态,并可以进行焦点操作。

如果是正常快速跳转Activity,在进入下一个Activity的瞬间触发onPause,这个时候在马上按返回键会直接触发onResume(不经过onStart生命周期)。

在这个生命周期里View是还能被操作并且不会报错的。(比如改变TextView的字体颜色,字体大小等等操作)

在启动另外一个Activity时,需要先回调当前前台Activity的onPause生命周期,才能回调需要启动Activity的onCreate() -> onStart() -> onResume(),这就意味着请不要在onPause生命周期里做耗时的操作,否则会让需要前台的Activity有明显的延迟

建议:

暂停视频播放

暂停摄像拍照预览

暂停动画

保存一些需要永久保存的UI值。

保存一些UI的临时值,方便下一次执行onResume的时候恢复显示。比如一些UI单选结果、多选结果,EditText里的内容。

释放与操作View有关的Callback或者Listener

onStop

特性:

 onPouse()方法完成之后,此时activity进入onStop()方法

在此生命周期Activity对用户是不可见的

在系统内存紧张的情况下,有可能会被系统进行回收。所以一般在当前方法可做资源回收。

在这个生命周期下操作View会报错

建议:

假设有Handler需要处理View,那么需要在这个生命周期里移除Handler里的所有待发消息。(handler.removeCallbacksAndMessages(null);)

释放Camera2或者Camera的资源。

释放视频播放VideoView的资源。

需要耗时释放的资源与后台操作建议放到此处进行。

onRestart

特性:

onRestart()方法在用户按下home()之后,再次进入到当前activity的时候调用。调用顺序onPouse()->onStop()->onRestart()->onStart()->onResume().

判断下一个生命周期onStart()是Activity恢复还是首次创建Activity。

建议:

1.增加一些判断给后续onStart或者onResume的生命周期里确定此activity是首次启动还是进入后台恢复的。这样可以避免一些重量级资源重复初始化。

onDestroy

 特性:

Activity被销毁钱最后一个被调用的方法。

Activity不可见。

在这个生命周期下操作View会报错。

这个生命周期并不会在Activity进入后台后马上执行,是否执行释放Activity是交给系统决定的。所以有概率执行onDestroy方法会延后。

建议:

释放一些实例节约空间,如置空List集合、Bean数据等。

操作耗时释放的资源。

置空Handler。

四、常见情况生命周期的执行顺序

第一次启动

onCreate() -> onStart() -> onResume()

从 A 跳转到 B

A_onPause() -> B_onCreate() -> B_onStart() -> B_onResume() -> A_onStop()

从 B 再次回到 A

B_onPause() -> A_onRestart() -> A_onStart() -> A_onResume() -> B_onStop()

用户按 home 键

onPause() -> onStop()

按 home 键后回到应用

onRestart() -> onStart() -> onResume()

用户按电源键屏保

onPause() -> onStop()

用户按电源键亮屏

onRestart() -> onStart() -> onResume()

用户按 back 键回退

onPause() -> onStop() -> onDestroy()

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

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

相关文章

Springboot 集成 Shardingsphere-JDBC

Springboot 集成 Shardingsphere-JDBC Shardingsphere系列目录:背景前提新增依赖分表策略简单分库分表策略垂直分库广播表水平分库(单表)水平分库(多表)水平分表 HINT配置逻辑代码 自定义分库分表(精准定位范围查询)配置代码精准定位数据库精…

Linux DNS配置文档

一、问题描述 1. 无法在浏览器通过域名访问百度; 2. 无法在终端 ping 通百度,例如:ping www.baidu.com 3. 可以 ping 通公网地址,例如:ping 114.114.114.114 或 ping 8.8.8.8 二、问题原因 域名解析 DNS 配置错误&am…

数据结构历年考研真题对应知识点(单链表、双链表、循环链表)

目录 2.3线性表的链式表示 2.3.1单链表的定义 【单链表的应用(2009、2012、2013、2015、2016、2019)】 2.3.2单链表上基本操作的实现 【单链表插入操作后地址或指针的变化(2016)】 2.3.3双链表 【双链表中插入操作的实现(2023)】 【循环双链表中删除操作的实现(2016)】 …

地图上绘制地铁线路

需求背景 不管是之前的pms 地铁还是location都会有需求涉及到地图上绘制地铁线路,来查看当前位置是否靠近地铁口,常规的交互可以看下高德地图,如图所示: 需求分析 不管是高德地图还是百度地图都提供了简易版的地铁线路图&#x…

Excel如何设置自动更新的固定选项

日常工作中你是否想要某数据列设置固定选项,如人力组、财务组、综合组、业务组等,可用“数据验证”实现,如后期新增选项“党建组”,该如何快速处理? 今天刘小生分享“超级表数据验证”方式,只实现固定选项…

若依RuoYi-Vue分离版—富文本Quill的图片支持伸缩大小及布局

若依RuoYi-Vue分离版—富文本Quill的图片支持伸缩大小及布局、工具栏带中文提示 1.在vue.config.js 文件中添加 一下内容2.下载安装插件3.在Editor组件中引入插件4.使用Editor组件(特别注意要的加 v-if )5.bug 之 imageResize的 img的style丢失1.先创建一…

不是所有洗碗机都能空气除菌 友嘉灵晶空气除菌洗碗机评测

精致的三餐让你以为生活是“享受”,可饭后那些油腻的锅碗瓢盆却成了你我美好生活的最大障碍。想要只吃美食不洗碗,那一台优秀的洗碗机就必不可少了!今天,ZOL中关村在线要评测的就是这样一台不光洗得干净更能有效除菌抑菌的洗碗机—…

SpringBoo+vue3+vite整合讯飞星火3.5通过webscoket实现聊天功能(前端代码)附带展示效果

访问地址: 天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/site 后端文档: SpringBoovue3整合讯飞星火3.5通过webscoket实现聊天功能(全网首发)附带展示效果_springboot websocket vue3-CSDN博客https://blog.csdn.net/qq_53722…

SAP MIGO 050 BADI:字段 GOITEM-XXXXX 未准备好输出

背景: MIGO过账时候需要根据某些条件更改某些字段的值,当要改的字段在前台不显示时,通过MB_MIGO_BADI~LINE_MODIFY去更改时,则会出现以下报错:MIGO050 解决方案1: 通过配置将该字段配置显示出来即可&…

电影美学复古胶片特效视频转场模板 | Premiere Pro 项目工程文件

这个Premiere Pro项目工程文件是一个电影美学胶片特效视频转场模板,每个过渡效果都散发出一种有机的怀旧魅力,让人回忆起经典电影卷轴和模拟摄影的独特美感。 项目特点: 胶片烧伤过渡效果:包括从微妙的闪烁到大胆的爆发&#xff…

学习总结报告模板

学习总结报告模板1 --年10月15日进入--公司至今已近两周时间,通过这段时间的工作和学习,已经适应了新的工作环境,了解了公司的发展历史及企业文化、认清了公司的组织结构及配置,熟识了大部分的同事,掌握了公司的大部分…

南充文化旅游职业学院领导一行莅临泰迪智能科技参观交流

6月18日,南充文化旅游职业学院旅游系副书记刘周、教务处教学运行与质量保障科科长及智慧旅游技术应用专业教研室主任李月娴、大数据技术专业负责人 龙群才、大数据技术专业专任教师 李昱洁莅临泰迪智能科技产教融合实训中心参观交流。泰迪智能科技董事长张良均、副总…

两种单例模式(保证线程安全)

开始前,球球各位读者给个三连吧,有错误感谢指出,谢谢 单例模式也叫单个实例,也就是这个类只有且只能有一个实例对象,这样一个类就叫做“单例”;单例模式有很多种,这里只介绍“饿汉模式”和“懒…

【Java】已解决Java中的java.util.NoSuchElementException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决Java中的java.util.NoSuchElementException异常 一、分析问题背景 java.util.NoSuchElementException是Java中常见的运行时异常,它通常发生在使用迭代器&#xf…

swagger下载文件名中文乱码、swagger导出文件名乱码、swagger文件导出名称乱码、解决swagger中文下载乱码bug

文章目录 一、场景描述:swagger导出文件名称乱码二、乱码原因三、解决方法3.1、方法一、在浏览器中输入地址下载3.2、方法二、swagger升级为2.10.0及以上 四、可能遇到的问题4.1、DocumentationPluginsManager.java:152 一、场景描述:swagger导出文件名称…

springboot与flowable(7):流程变量

一、启动时添加流程变量 拿第一个流程图举例,创建一个新的流程定义。 Testvoid contextLoads() {DeploymentBuilder deployment repositoryService.createDeployment();deployment.addClasspathResource("process01/FirstFlow.bpmn20.xml");deployment.…

android | MemoryLeakMonitor.jar is not exist! 目前还是存在这个问题,好像解决不到

2024了,用的华为的老机子 navo3 真机测试,目前还是这个渲染问题:滑动验证页面 MemoryLeakMonitor.jar is not exist! Software rendering doesnt support hardware bitmaps gpu的渲染问题: 这条信息“Software rendering doesnt…

动态规划-简单多状态dp问题 -- 删除并获得点数

动态规划-简单多状态dp问题 – 删除并获得点数 文章目录 动态规划-简单多状态dp问题 -- 删除并获得点数题目重现读懂题目算法流程示例代码 题目重现 题目链接:删除并获得点数 - 力扣 给你一个整数数组 nums ,你可以对它进行一些操作。 每次操作中&#…

用画图,将2张图片,合并成 一张图片 + 压缩体积

合并 第一步:选中要做比较的两张图片其中一张,单击鼠标右键,选择“打开方式--画图”。 第二步:如果图片过大,占据了整个屏幕不好观察,用右下角的标尺,缩小视图 第三步:鼠标左键按住…

HTTP学习记录(基于菜鸟教程)

文章目录 1.简介1.1常用的HTTP方法1.2Http版本1.3注意事项 2.Https3.Http消息结构3.1客户端请求消息3.2响应消息 4.常见的响应头5.HTTP状态码6.Http content-type在这里插入图片描述 7.MIME类型8.HTTP2 1.简介 Http,被称为超文本传输协议,HyperText Tran…