当前位置: 首页 > 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实现,实现的方式和原理,在后面的文章中会做介绍。

 
http://www.lryc.cn/news/154793.html

相关文章:

  • Golang 程序漏洞检测利器 govulncheck(一):安装和使用方法
  • 强化学习算法总结 2
  • 修改node_modules避免更新覆盖 patch-package
  • Elasticsearch安装,Springboot整合Elasticsearch详细教程
  • OJ题库:计算日期到天数转换、打印从1到最大的n位数 、尼科彻斯定理
  • 混合动力汽车耐久测试
  • useRef 定义的 ref 在控制台可以打印但是页面不生效?
  • 【Java 动态数据统计图】动态数据统计思路案例(动态,排序,动态数组(重点推荐))七(129)
  • Cell Reports | 揭开METTL14在介导m6A修饰中的神秘面纱
  • 297. 二叉树的序列化与反序列化
  • 肖sir__设计测试用例方法之边界值03_(黑盒测试)
  • 功能测试常用的测试用例大全
  • css利用flex分配剩余高度出现子组件溢出问题
  • Java中的网络编程------基于Socket的TCP编程和基于UDP的网络编程,netstat指令
  • 【【STM32-29正点原子版本串口发送传输实验】
  • 【面试题精讲】什么是websocket?如何与前端通信?
  • unity tolua热更新框架教程(2)
  • 【0904作业】QT 完成登陆界面跳转到聊天室+完成学生管理系统的查找和删除功能
  • ceph源码阅读 buffer
  • 基本介绍——数据挖掘
  • Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
  • 冯诺依曼体系结构/什么是OS?
  • SD卡/TF卡简记
  • Dockerfile COPY的奇怪行为:自动解包一级目录
  • 【每日一题Day311】LC1761一个图中连通三元组的最小度数 | 枚举
  • 前端日期减一天的笑话
  • 高效能,一键批量剪辑,AI智剪让创作更轻松
  • 手写Mybatis:第15章-返回Insert操作自增索引值
  • 【数据结构】动态数组(vector)的基本操作,包括插入、删除、扩容、输出、释放内存等。以下是代码的解释和注释:
  • [unity]三角形顶点顺序