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,一经查实,立即删除!

相关文章

bms电池管理系统中放电过流1,放电过流2,放电过流3,分别是什么意思

在电池管理系统(BMS)中,“放电过流1”、“放电过流2”、“放电过流3” 这些术语可能代表了不同级别的放电过电流保护阈值或状态。这些级别通常是基于电池的安全工作范围和性能特性来设定的,用以在不同的电流水平下提供不同程度的保…

Springboot 集成 Shardingsphere-JDBC

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

什么是本地启动?

今天在进行接口测试的时候,我刚开始傻乎乎的,不会测试嘛,那个 postman 里面叫你填那个URL,我就把设备管理系统的地址填了上去:http://192.168.0.237.27000/。 睿哥看了之后,跟我说:“你填这个地…

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)】 …

如何抓取 GitHub:实用教程 2024

GitHub 是互联网上最重要的技术知识来源之一,对于构建复杂应用程序的开发人员来说尤其如此。跟随本指南学习如何提取这些宝贵的数据,毫不费力地紧跟最新技术趋势。 了解 GitHub 数据 开源项目文化为开发人员提供了许多分享、贡献和合作的机会&#xff…

多个类下所有方法AOP

微服务下有两个类,需要做异常捕获再抛出,笔者立马想到了AOP 非微服务,只能使用代理 Slf4j Aspect Component public class SdkAspect {Pointcut("execution(* com.aspire.service.impl.XxxEncryption.*(..))")public void enPointc…

android的surface

相信很多Android开发者都知道Canvas类是UI的画布(虽然这种说法并不严谨),因为我们在Canvas上完成各种图形的绘制,那么我们Activity上的各种交互控件又是如何展示并渲染到屏幕上的呢,所以在另一个层面上也有一个“画布”…

安卓开发拉起其他应用的常用方式

在安卓开发中,拉起其他应用(即启动其他应用)有几种常见的方式: 通过显式 Intent: 这种方式需要知道目标应用的包名和具体的 Activity 名称。 Intent intent new Intent(); intent.setComponent(new ComponentName(…

地图上绘制地铁线路

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

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

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

pytorch笔记:清理GPU内存

1 Control-C 中止运行GPU 存储没有及时释放 在使用 GPU 进行深度学习训练时,通过 Control-C 中止程序后,有时会发现 GPU 内存没有及时释放这主要是因为以下几个原因 进程未完全终止: 当我们按下 Control-C 时,只是发送了一个中断…

若依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: 通过配置将该字段配置显示出来即可&…

【文末附gpt升级秘笈】关于“登月游戏”的详细内容介绍

当然可以。以下是关于“登月游戏”的详细内容介绍: 一、游戏背景与目标 “登月游戏”是一款基于1969年人类首次登陆月球事件而开发的计算机游戏。其背景设定在月球表面,玩家需要扮演宇航员,操控登月器在月球上实现软着陆。游戏的目标是在确…

【教师资格证考试综合素质——法律专项】未成年人保护法笔记以及练习题

《中华人民共和国未成年人保护法》 目录 第一章 总 则 第二章 家庭保护 第三章 学校保护 第四章 社会保护 第五章 网络保护 第六章 政府保护 第七章 司法保护 第八章 法律责任 第九章 附 则 介一.首次颁布:第一部《中华人民共和国未成年人保护法…

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

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

学习总结报告模板

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