【Android】重温Activity生命周期

【Proteus】NE555纯硬件实现LED呼吸灯效果,附源文件,效果展示 本设计通过NE555与三极管的巧妙配合,仅用基础元件实现了呼吸灯效果。核心在于利用RC积分电路将PWM信号转换为控制电压,并通过负反馈动态调节占空比。Proteus仿真验证了方案的可行性,读者可进一步优化参数或扩展功能,探索更多硬件设计可能性。 阅读详情

前言

Android中用得最多的组件是Activity,而它的生命周期也是最基础的知识,从刚接触Android到工作中会频繁依赖这部分知识。可能大多数人能说出页面新建到页面关闭会走的生命周期:onCreate、onStart、onResume、onPause、onStop、onDestory,但是还有其它使用场景不多的生命周期却鲜为人知,比如onWindowFocusChanged、onSaveInstanceState、onRestoreInstanceState、onRetainNonConfigurationInstance等,这些生命周期用处很大,它们很容易被忽略或遗忘,今天Review一下它们的作用以及调用的时机。

基于实时求是的原则,就亲手写一个demo。

笔者原创,转载请注明出处:https://blog.youkuaiyun.com/devnn/article/details/137832051

onWindowFocusChanged

它通常用来获取View的宽高,我们知道在onCreate生命周期中直接获取View的宽高会显示0,这是因为View还没有绘制。而在onWindowFocusChanged中能获取宽高,因为View在它之前已经绘制好了。它的调用时机在onResume和performTravesals()函数之后。关于获取View的宽高还有其它几种方法,这里就不展开了。

onSaveInstanceState

它通常用来保存页面的上的数据,用来在页面重建时恢复数据。它的调用时机分两种情况,Andriod 9.0之后在onStop和onDetory之间,Andriod 9.0之前在onPause和onStop之间。

onRestoreInstanceState

它通常用来恢复页面上的数据,仅在页面重建时调用,正常跳转是不会调用的。它在onStart和onResume之间调用。页面重建的情况比如旋转屏幕、系统资源充足时恢复页面。
在这里插入图片描述

onRetainNonConfigurationInstance

这个函数是在配置变化时调用,比如屏幕旋转。它的返回值是Object,配合getLastNonConfigurationInstance() 函数可以获取保存的Object对象。这意味着它可以保存任意类型的数据,而onSaveInstanceState只能保存bundle类型的数据。这也是Jetpack中ViewModel框架能保存数据的原理。不过这个函数在ComponentActivity中被重写成了final修饰,因此如果你的Activity继承AppCompatActivity是无法重写的。

下面观察一下Demo日志,加深一下我们的认识。

启动App

App启动到MainActivity:

----------------------------------------启动App----------------------------------------------------
2024-04-16 16:37:23.737 8607-8607/com.devnn.demo I/MyApp: attachBaseContext

2024-04-16 16:37:23.956 8607-8607/com.devnn.demo I/MyApp: onCreate

2024-04-16 16:37:24.984 8607-8607/com.devnn.demo I/MainActivity: onCreate
2024-04-16 16:37:25.516 8607-8607/com.devnn.demo I/MainActivity: onStart
2024-04-16 16:37:25.527 8607-8607/com.devnn.demo I/MainActivity: onResume
2024-04-16 16:37:26.604 8607-8607/com.devnn.demo I/Choreographer: Skipped 62 frames!  The application may be doing too much work on its main thread.
2024-04-16 16:37:27.141 8607-8607/com.devnn.demo I/Choreographer: Skipped 31 frames!  The application may be doing too much work on its main thread.
2024-04-16 16:37:27.440 8607-8607/com.devnn.demo I/MainActivity: onWindowFocusChanged,hasFocus=true

由于无关日志比较多,删除了一些无关日志。

页面跳转

从MainActivity跳转到DemoActivity1:

----------------------------------------跳转-------------------------------------------------------------
2024-04-16 16:40:20.459 8607-8607/com.devnn.demo I/MainActivity: onPause
2024-04-16 16:40:20.872 8607-8607/com.devnn.demo I/DemoActivity1: onCreate
2024-04-16 16:40:20.926 8607-8607/com.devnn.demo I/DemoActivity1: onStart
2024-04-16 16:40:20.928 8607-8607/com.devnn.demo I/DemoActivity1: onResume
2024-04-16 16:40:22.134 8607-8607/com.devnn.demo I/MainActivity: onWindowFocusChanged,hasFocus=false
2024-04-16 16:40:22.195 8607-8607/com.devnn.demo I/Choreographer: Skipped 69 frames!  The application may be doing too much work on its main thread.
2024-04-16 16:40:22.358 8607-8607/com.devnn.demo I/DemoActivity1: onWindowFocusChanged,hasFocus=true
2024-04-16 16:40:22.767 8607-8607/com.devnn.demo I/MainActivity: onStop
2024-04-16 16:40:22.772 8607-8607/com.devnn.demo I/MainActivity: onSaveInstanceState

这里要注意的是,跳转新页面首先会走前一个页面的onPause,等新页面的onResume和onWindowFocusChanged执行完,才会走前一个页面的onStop和onSaveInstanceState。

页面回退

从DemoActivity1回退到MainActivity:

----------------------------------------回退----------------------------------------------------------------
2024-04-16 16:42:03.231 8607-8607/com.devnn.demo I/DemoActivity1: onPause
2024-04-16 16:42:03.267 8607-8607/com.devnn.demo I/MainActivity: onStart
2024-04-16 16:42:03.273 8607-8607/com.devnn.demo I/MainActivity: onResume
2024-04-16 16:42:03.302 8607-8607/com.devnn.demo I/DemoActivity1: onWindowFocusChanged,hasFocus=false
2024-04-16 16:42:03.658 8607-8607/com.devnn.demo I/MainActivity: onWindowFocusChanged,hasFocus=true
2024-04-16 16:42:04.308 8607-8607/com.devnn.demo I/DemoActivity1: onStop
2024-04-16 16:42:04.355 8607-8607/com.devnn.demo I/DemoActivity1: onDestroy

屏幕旋转

-------------------------------------------屏幕旋转-----------------------------------------
2024-04-16 16:48:12.004 8607-8607/com.devnn.demo I/MainActivity: onPause
2024-04-16 16:48:12.014 8607-8607/com.devnn.demo I/MainActivity: onStop
2024-04-16 16:48:12.015 8607-8607/com.devnn.demo I/MainActivity: onSaveInstanceState
2024-04-16 16:48:12.016 8607-8607/com.devnn.demo I/MainActivity: onDestroy
2024-04-16 16:48:12.346 8607-8607/com.devnn.demo I/MainActivity: onCreate
2024-04-16 16:48:12.577 8607-8607/com.devnn.demo I/MainActivity: onStart
2024-04-16 16:48:12.579 8607-8607/com.devnn.demo I/MainActivity: onRestoreInstanceState
2024-04-16 16:48:12.579 8607-8607/com.devnn.demo I/MainActivity: onRestoreInstanceState,data=abc
2024-04-16 16:48:12.579 8607-8607/com.devnn.demo I/MainActivity: onResume
2024-04-16 16:48:12.599 8607-8607/com.devnn.demo I/Choreographer: Skipped 33 frames!  The application may be doing too much work on its main thread.
2024-04-16 16:48:13.955 8607-8607/com.devnn.demo I/Choreographer: Skipped 80 frames!  The application may be doing too much work on its main thread.
2024-04-16 16:48:13.962 8607-8607/com.devnn.demo I/MainActivity: onWindowFocusChanged,hasFocus=true

以下是onSaveInstanceState和onRestoreInstanceState的日志代码:

  override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        Log.i("MainActivity", "onSaveInstanceState")
        outState.putString("test", "abc")
    }
  override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        Log.i("MainActivity", "onRestoreInstanceState")
        val data = savedInstanceState.getString("test", "nothing")
        Log.i("MainActivity", "onRestoreInstanceState,data=${data}")
    }

彩蛋

细心的读者,可能发现怎么有那么多掉帧日志,这个Demo里其实没有阻塞主线程的代码。这其实跟这篇文章主题无关,保留这个日志也是为了验证一个结论,请读者细品~

笔者原创,转载请注明出处:https://blog.youkuaiyun.com/devnn/article/details/137832051

【RV1126/RV1109学习笔记】#基础篇#(2)基础入门使用 一、调试方式 1、串口调试 2、ADB调试 3、网络调试 二、基础外设使用 音频使用(aplay,arecord,amixer) 三、WIFI连接 四、屏幕背光控制 阅读详情

相关推荐

codesys【modbusRTU】主站

【代码】modbusRTU【codesys】

cfqq1989的博客 4374

Android基础 - 重温Activity生命周期

《Android开发艺术探索》买了好久了,将近有两年了,一直没有好好系统的看过,在浑浑噩噩的过日子,浪费好多时间;现在从头再来,坚持下去给自己一个希望。 典型的生命周期 7个生命周期方法 onCreate:Activity正在被创建 初始化布局资源和数据 onRestart:Activity正在重启启动,从不可见变为可见状态 按Home键返回桌面,再点击桌面图标返回App ...

学习,思考,输出 730

2025数学建模国赛A题1-4问详解(论文+完整代码)

本文介绍了数学建模国赛A题的解题思路,重点分析了三维遮蔽模型的建立和运动学代码实现。相比第一题,第二题增加了未知参数求解,需要采用遗传算法等非线性优化方法。文章强调该模型由专业团队原创开发,代码可运行,并提醒参赛者警惕市场上的保奖班现象。整体内容聚焦于竞赛解题技巧和原创性保证。

Eloveeeee的博客 2799

重温Android四大组件(一)—Activity的生命周期

前言 四大组件对于Android开发者是老生常谈的知识了,相信每个Android开发者对四大组件都已经很熟悉了。但是四大组件作为Android应用的基础,作为开发者不仅要熟悉而且要烂熟于心。 这里以《重温Android四大组件》为题目是为了巩固自己的Android基础,加深对Android的认知。 Activity生命周期探索 Activity生命周期是Activity在不同场景下表现的一种状态,...

码小二的博客 397

WorkBench3.2 + VxWorks6.8安装教程

按照FTP连接主机和目标机,将整个VxWorks6.8的安装分为两个部分,一是在主机(win10系统,可以使用虚拟机或者实体机,推荐使用虚拟机)上安装workbench3.2,进行bootrom与VxWroks映像文件的生成,二是在虚拟机上安装VxWorks系统 19.10.10 首先很高兴文章能帮到大家,但由于本人已不做该方向良久,私信和评论的很多问题现在已经无法解答,如果大家有什么问题欢迎...

Alive的博客 3万+

使用mid360运行lio-livox对比fast-lio2

msg_type为激光雷达发出的数据格式,有livox自定义数据类型格式CustomMsg和ros标准的PointCloud2格式,因此首先需要确定激光雷达端配置的是哪种格式。可以从激光雷达的ros驱动中看到驱动端有三种格式可以选,驱动端的数字2对应lio-livox中的1,驱动端的0对应lio-livox的格式0。如果使用的是Ubuntu18.04编译完成后运行直接成功,如果使用20.04运行会报错,需要修改以下源代码。针对livox-mid360 运行lio-livox的一些问题。

z1872385的博客 1230

重温Android四大组件(一)—Activity的生命周期

前言 四大组件对于Android开发者是老生常谈的知识了,相信每个Android开发者对四大组件都已经很熟悉了。但是四大组件作为Android应用的基础,作为开发者不仅要熟悉而且要烂熟于心。 这里以《重温Android四大组件》为题目是为了巩固自己的Android基础,加深对Android的认知。 Activity生命周期探索 Activity生命周期是Activity在不同场景下表现的一种状态,...

weixin_34087301的博客 192

即插即用篇 | 手把手教你 YOLOv11 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!

即插即用篇 | 手把手教你 YOLOv11 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!

Coding... 2831

Activity生命周期的深入思考

作为一个android开发者的必须掌握的其中一条就是activity的生命周期,参与项目的过程中不断地基础activity,一直没有时间对生命周期进行深入的了解,在此重温activit的生命周期,发现新大陆!Actvity的生命周期        在上图中我们可以看到google已经将一个完整的生命周期呈现给我们,单纯的看图我们能够知道一个activity具有哪些生命周期,但是它到底是如何工作

lwjfork的博客 385

【Burp入门第二篇】Chrome配置BurpSuite代理教程

1、配置Burp代理为127.0.0.1:80802、扩展商店添加插件switchyomega,修改服务器和端口为下图:3、打开代理,选择刚才添加的代理

等风来 8368

共享单车数据抓取与分析:使用Python爬虫抓取共享单车使用数据与地图信息

通过本篇博客,我们展示了如何使用Python爬虫抓取共享单车的使用数据和地图信息,并通过简单的数据分析得出有价值的见解。在实际应用中,数据的收集与分析不仅能帮助城市管理者更好地规划单车站点,还能为用户提供更精准的单车使用体验。未来,我们可以将此分析与机器学习模型相结合,进一步预测单车的使用趋势,优化调度算法,实现更加智能的共享单车管理。

2201_76125261的博客 2204

重温-Activity生命周期

重温-Activity生命周期

Android小白 721

100天精通Python(可视化篇)——第80天:matplotlib绘制不同种类炫酷柱状图代码实战(簇状、堆积、横向、百分比、3D柱状图)

0. 专栏导读 1. 普通柱状图 2. 簇状柱形图 3. 堆积柱形图 4. 横向柱状图 5. 横向双向柱状图 6. 百分比堆积柱形图 7. 3D柱形图 8. 3D堆积柱形图 9. 3D百分比堆积柱形图

努力让自己发光,对的人才能迎着光而来 2万+

重温Acticity和Fragment生命周期

重温下Android和Fragment生命周期,理解生命周期方法的作用,什么时候调用,可以做一些什么操作。 1、Android生命周期 1.1 生命周期图 1.2 生命周期函数说明 onCreate:Activity正在创建,生命周期的第一个方法,需要setContentView加载layout。这里不建议耗时操作,只做layout和控件初始化。此方法传递一个 Bundle 对象,可以获取上一...

fomin 1000

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android知识重温之生命周期

生命周期回顾 Activity和Fragment的生命周期是Android开发的基础,也是其中最重要的一部分,掌握了各种情景下的生命周期,能够更好的帮助我们解决问题 Activity的生命周期方法以及常用方法 onCreate(): 当activity是被创建时候,会自动运行该方法。该方法做一些初始化动作. onRestart(): 把activity从onStop状态唤醒时,会用onResta...

weixin_33695450的博客 368

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

重温Activity的各种状态

姐混不下去了,姐自学APP今天重新温习了Activity的各种状态,GoogleDocument上面的那张图很是经典的,我好好看了,今天试了之前一直不太确定的问题|-protected void onCreate(Bundle savedInstanceState);  |-----protected void onStart(); |-----------protected void onResume();|-----------protected void onPause(); |-----protec

Lily's Android tech Blog 1971

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

重温Android四大组件(二)—Activity的启动模式与标志位

前言 重温Android四大组件的第二篇,主要总结Activity的启动模式以及相关的标志位。Activity启动模式是Activity的一个重要的属性,启动模式决定了Activity在Activity栈的存在的行为。不同的启动模式下的Activity有不同的表现,所以开发者需要搞清楚各个启动模式的特性以及相互之间的区别。 Activity的启动模式 standard(标准模式):这是系统默认的...

码小二的博客 427

重温Android和Fragment生命周期

重温下Android和Fragment生命周期,理解生命周期方法的作用,什么时候调用,可以做一些什么操作。 1、Android生命周期 1.1 生命周期图 1.2 生命周期函数说明 onCreate:Activity正在创建,生命周期的第一个方法,需要setContentView加载layout。这里不建议耗时操作,只做layout和控件初始化。此方法传递一个 Bundle 对象,可...

weixin_30632899的博客 202

android中fragment生命周期,重温Android和Fragment生命周期

onCreate:Activity正在创建,生命周期的第一个方法,需要setContentView加载layout。这里不建议耗时操作,只做layout和控件初始化。此方法传递一个 Bundle 对象,可以获取上一个Activity 的状态。onStart:Activity正在启动,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互,这里也可以初始化控件,但官方推荐在...

weixin_26833503的博客 538

【Android Training - 01】详解Activity生命周期 [ Lesson 0 - 章节概览 ]

Managing the Activity Lifecycle[管理Activity生命周期] 当用户进入,退出,回到你的App,在程序中的Activity 实例都经历了生命周期中的不同状态。例如,当你的activity第一次启动的时候,它来到系统的前台,开始接受用户的焦点。在此期间,Android系统调用了一系列的生命周期中的方法。如果用户执行了启动另一个activity或者切换到另一个a

迁移到http://hukai.me 4006

重温 Activity的生命周期

1.Activity的本质是什么 2.Activity的生命周期 3.Activity的启动方式---直接启动、匿名启动 4.Activity之间的数据交互 5.如何启动系统的Activity 6.Activity的启动模式 Activity的声明周期: 第一次启动:onCreate(

有酒平步上青天 695

重温activity生命周期

早上突然想起:activity切换的时候生命周期是什么来着? Activity A跳转到Activity B,然后B再跳到A; A;onCreat-start-resume   然后 onpause-B oncreat还是onPuse-onStop-B onCreat?????? what a fuck? 这都忘了? 那就实际测试一遍再学一次吧。 1.先打印A启动时的生

前人挖坑,后人种(pen) 319

重温四大组件(三)—Activity的启动过程

前言 重温四大组件第四篇,这里分析一下Activity的启动过程。Activity的启动过程分为两种,一种是根Activity的启动,另外一种是普通Activity的启动过程。根Activity也就是默认启动的Activity(在AndroidMinifest.xml配置的启动Activity)。普通Activity指的是除根Activity的其他Activity。其中根Activity和普通Ac...

码小二的博客 268

Activity的生命周期和启动模式

网上类似的分析资料有很多,然而终究只是别人写出来的分享,自己写下来算是再次重温吧。一、Activity生命周期在正常情况下,Activity的生命周期: onCreate:Activity正在被创建 onRestart:Activity正在重新启动 onStart:Activity正在被启动 onResume:Activity已经可见 onPause:Activity正在停止,此时可以做一些存储数据

守望君的自留地 460

系统重温安卓

做过好几个简单的安卓小项目后,常常觉得自己的水平常常处于能做出来东西,但是原理等有时会很模糊,所以重温重温原理 首先是四大组件之 Activity: 首先是Activity的主要框架: public class  Activity extends Activity {  @Override    public void onCreate(Bundle savedI

shenbushen的专栏 458

android 启动模式对应的标志位,重温Android四大组件(二)—Activity的启动模式与标志位...

前言重温 Android 四大组件的第二篇,主要总结Activity的启动模式以及相关的标志位。Activity启动模式是Activity的一个重要的属性,启动模式决定了Activity在Activity栈的存在的行为。不同的启动模式下的Activity有不同的表现,所以开发者需要搞清楚各个启动模式的特性以及相互之间的区别。Activity的启动模式standard(标准模式):这是系统默认的启动...

weixin_35762258的博客 556
上一篇: 【Android】美团组件化路由框架WMRouter源码解析
下一篇: 【Android】SharedPreferences阻塞问题深度分析
devnn
博客等级 码龄12年 2005粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值