深入分析 Android Activity (四)
文章目录
- 深入分析 Android Activity (四)
- 1. Activity 的生命周期详解
- 1.1 `onCreate`
- 1.2 `onStart`
- 1.3 `onResume`
- 1.4 `onPause`
- 1.5 `onStop`
- 1.6 `onDestroy`
- 1.7 `onRestart`
- 2. Activity 状态的保存与恢复
- 2.1 保存状态
- 2.2 恢复状态
- 3. Activity 的启动优化
- 3.1 延迟初始化
- 3.2 使用 `ViewStub`
- 3.3 分析启动性能
- 4. 深入理解 Activity 的窗口管理
- 4.1 `Window`
- 4.2 `WindowManager`
- 5. Activity 的任务和返回栈管理
- 5.1 启动 Activity 的 Intent 标志
- 5.2 处理返回栈中的数据
- 6. Activity 的内存管理
- 6.1 内存泄漏检测
- 7. Activity 的主题和样式
- 7.1 自定义主题
- 7.2 动态切换主题
- 总结
深入分析 Android Activity (四)
1. Activity 的生命周期详解
Activity 的生命周期方法提供了一组回调,使开发者能够在不同状态下执行相应的逻辑。了解这些方法有助于开发者管理资源和确保应用程序的行为一致。
1.1 onCreate
onCreate 是 Activity 的入口点,系统在创建 Activity 时调用。这个方法是设置界面和初始化资源的最佳位置。
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Initialize resources
}
1.2 onStart
onStart 方法在 Activity 对用户可见时调用,但此时用户还无法进行交互。此方法适合开始准备界面所需的资源。
@Override
protected void onStart() {super.onStart();// Prepare resources that need to be visible to the user
}
1.3 onResume
onResume 方法在 Activity 准备好与用户进行交互时调用。此方法适合开始动画、音频播放等需要用户交互的操作。
@Override
protected void onResume() {super.onResume();// Resume animations, audio playback, etc.
}
1.4 onPause
onPause 方法在 Activity 即将停止与用户交互时调用。这是保存数据和停止动画等操作的好时机。
@Override
protected void onPause() {super.onPause();// Pause animations, save data, etc.
}
1.5 onStop
onStop 方法在 Activity 不再对用户可见时调用。此方法适合释放不再需要的资源。
@Override
protected void onStop() {super.onStop();// Release resources no longer needed
}
1.6 onDestroy
onDestroy 方法在 Activity 被销毁前调用。这里是进行最终清理的好地方。
@Override
protected void onDestroy() {super.onDestroy();// Clean up resources
}
1.7 onRestart
onRestart 方法在 Activity 从停止状态重新启动时调用。这里可以重新初始化在 onStop 方法中释放的资源。
@Override
protected void onRestart() {super.onRestart();// Re-initialize resources released in onStop
}
2. Activity 状态的保存与恢复
为了应对配置变化和进程被系统回收等情况,Activity 提供了 onSaveInstanceState 和 onRestoreInstanceState 方法来保存和恢复状态。
2.1 保存状态
onSaveInstanceState 在 Activity 即将被销毁时调用,用于保存临时状态信息。
@Override
protected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putString("key", "value");
}
2.2 恢复状态
onRestoreInstanceState 在 Activity 被重新创建后调用,用于恢复之前保存的状态信息。
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);String value = savedInstanceState.getString("key");
}
也可以在 onCreate 方法中恢复状态:
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (savedInstanceState != null) {String value = savedInstanceState.getString("key");}
}
3. Activity 的启动优化
在实际开发中,优化 Activity 的启动时间对于提升用户体验非常重要。以下是一些常见的优化技巧:
3.1 延迟初始化
将非关键资源的初始化延迟到用户实际需要的时候,从而减少 onCreate 方法的执行时间。
// Load non-critical data after the UI is rendered
private void loadNonCriticalData() {new Handler().postDelayed(() -> {// Load non-critical data here}, 1000);
}
3.2 使用 ViewStub
对于可能不会立即显示的布局,可以使用 ViewStub 延迟加载。
<ViewStubandroid:id="@+id/view_stub"android:layout_width="match_parent"android:layout_height="match_parent"android:layout="@layout/your_layout"/>
在代码中加载:
ViewStub viewStub = findViewById(R.id.view_stub);
View inflatedView = viewStub.inflate();
3.3 分析启动性能
使用 Android Profiler 分析 Activity 的启动性能,找到并优化瓶颈。
// Profile your app to identify performance bottlenecks
4. 深入理解 Activity 的窗口管理
4.1 Window
Window 是 Activity 管理视图的顶级窗口,Activity 使用 PhoneWindow 类来实现。Window 管理状态栏、标题栏和内容区域。
4.2 WindowManager
WindowManager 是一个系统服务,负责管理窗口。通过 WindowManager 可以控制窗口的布局参数。
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.height = WindowManager.LayoutParams.MATCH_PARENT;
params.width = WindowManager.LayoutParams.MATCH_PARENT;
window.setAttributes(params);
5. Activity 的任务和返回栈管理
Android 使用任务和返回栈来管理 Activity 的导航。每个任务由一个栈来管理 Activity。
5.1 启动 Activity 的 Intent 标志
使用 Intent 标志控制 Activity 的启动行为和返回栈。例如:
FLAG_ACTIVITY_NEW_TASK:在新的任务中启动Activity。FLAG_ACTIVITY_CLEAR_TOP:如果目标Activity已经在栈中存在,则将其上面的所有Activity清除。
Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
5.2 处理返回栈中的数据
使用 onActivityResult 方法处理从另一个 Activity 返回的数据:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {String result = data.getStringExtra("key");// Handle the result}
}
在启动 Activity 时可以传递请求代码:
Intent intent = new Intent(this, AnotherActivity.class);
startActivityForResult(intent, REQUEST_CODE);
6. Activity 的内存管理
Android 系统会在内存不足时终止后台 Activity,以释放资源。因此,必须在 onSaveInstanceState 和 onRestoreInstanceState 中保存和恢复关键数据。
6.1 内存泄漏检测
使用工具如 LeakCanary 进行内存泄漏检测:
// Add LeakCanary dependency in build.gradle
dependencies {debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:2.7'
}// Initialize LeakCanary in Application class
public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();if (LeakCanary.isInAnalyzerProcess(this)) {return;}LeakCanary.install(this);}
}
7. Activity 的主题和样式
通过自定义主题和样式,可以统一管理 Activity 的外观和行为。
7.1 自定义主题
在 res/values/styles.xml 中定义自定义主题:
<resources><style name="CustomTheme" parent="Theme.AppCompat.Light.DarkActionBar"><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item></style>
</resources>
在 AndroidManifest.xml 中应用自定义主题:
<activity android:name=".MyActivity"android:theme="@style/CustomTheme">
</activity>
7.2 动态切换主题
通过 recreate 方法动态切换 Activity 的主题:
// Change theme and recreate Activity
setTheme(R.style.CustomTheme);
recreate();
总结
Android Activity 的设计涵盖了生命周期管理、视图层次结构、任务和返回栈管理、内存管理、主题和样式等方面。理解这些概念和内部实现有助于开发者创建高效、稳定和响应迅速的应用程序。通过灵活应用这些知识,可以提升应用程序的用户体验和性能。
| 欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |

相关文章:
深入分析 Android Activity (四)
文章目录 深入分析 Android Activity (四)1. Activity 的生命周期详解1.1 onCreate1.2 onStart1.3 onResume1.4 onPause1.5 onStop1.6 onDestroy1.7 onRestart 2. Activity 状态的保存与恢复2.1 保存状态2.2 恢复状态 3. Activity 的启动优化3.1 延迟初始化3.2 使用 ViewStub3.…...
Java实现顺序表
Java顺序表 前言一、线性表介绍常见线性表总结图解 二、顺序表概念顺序表的分类顺序表的实现throw具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与…...
刷题笔记1:如何科学的限制数字溢出问题
LCR 192. 把字符串转换成整数 (atoi) - 力扣(LeetCode) 我们以力扣的此题目为例,简述在诸如大数运算等问题中如何限制数字溢出问题。 先来直接看看自己的处理方式: class Solution { public:int myAtoi(string str) {int pcur0;…...
社区供稿丨GPT-4o 对实时互动与 RTC 的影响
以下文章来源于共识粉碎机 ,作者AI芋圆子 前面的话: GPT-4o 发布当周,我们的社区伙伴「共识粉碎机」就主办了一场主题为「GPT-4o 对实时互动与 RTC 的影响」讨论会。涉及的话题包括: GPT-4o 如何降低延迟(VAD 模块可…...
基于Linux的文件操作(socket操作)
基于Linux的文件操作(socket操作) 1. 文件描述符基本概念文件描述符的定义:标准文件描述符:文件描述符的分配: 2. 文件描述符操作打开文件读取文件中的数据 在linux中,socket也被认为是文件的一种ÿ…...
C++面试题记录(网络)
TCP与UDP区别 1. TCP面向连接,UDP无连接,所以UDP数据传输效率更高 2.UDP可以支持一对一、一对多、多对一、多对多通信,TCP只能一对一 3. TCP需要在端系统维护连接状态,包括缓存,序号,确认号,…...
YoloV8改进策略:卷积篇|基于PConv的二次创新|附结构图|性能和精度得到大幅度提高(独家原创)
摘要 在PConv的基础上做了二次创新,创新后的模型不仅在精度和速度上有了质的提升,还可以支持Stride为2的降采样。 改进方法简单高效,需要发论文的同学不要错过! 论文指导 PConv在论文中的描述 论文: 下面我们展示了可以通过利用特征图的冗余来进一步优化成本。如图3所…...
图论(从数据结构的三要素出发)
文章目录 逻辑结构物理结构邻接矩阵定义性能分析性质存在的问题 邻接表定义性能分析存在的问题 十字链表(有向图)定义性能分析 邻接多重表(无向图)定义性能分析 数据的操作图的基本操作图的遍历广度优先遍历(BFS)算法思想和实现性能分析深度优先最小生成…...
spark相关知识
1.Spark的特点 Spark的设计遵循“一个软件栈满足不同应用场景”的理念,逐渐形成了一套完整的生态系统,既能够提供内存计算框架,也可以支持SQL即席查询、实时流式计算、机器学习和图计算等。 运行速度快,易使用,强大的技…...
K8S认证|CKA题库+答案| 12. 查看Pod日志
目录 12、查看Pod日志 CKA v1.29.0模拟系统 下载试用 题目: 开始操作: 1)、切换集群 2)、提取错误日志 3)、验证提取结果 12、查看Pod日志 CKA v1.29.0模拟系统 下载试用 题目: 您必须在以下C…...
【Java SE】 String、StringBuff和StringBuilder
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 字符串不可变性1.1 设计不可变1.2 修改字符串创建新对象1.3 为什么字符串不可变1.4 String类设计不可变的…...
产品经理-需求分析(三)
1. 需求分析 从业务的需要出发,确定业务目的和目标,将业务需求转为产品需求 1.1 业务需求 业务需求 业务动机 业务目标 就是最根本的动机和目标成果,通过这个需求解决特定的问题 1.2 产品需求 产品需求 解决方案 产品结构 产品流程…...
Linux 编译器gcc/g++使用
gcc/g同理 编译器运行过程 1. 预处理(进行宏替换) gcc -E a.c -o a.i 预处理后还是c语言 -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面 告诉gcc,从现在开始进行程序的翻译,将预处理工作做完停下 2. 编译&#x…...
adam优化器计算过程(tensorflow)
一、adam原理 原理 应用 优点 缺点 二、手动实现 一步一步计算 三、使用tensorflow api实现 api使用 四、一个具体的深度学习的例子...
【数据结构与算法 | 链表篇】力扣876
1. 力扣876 : 链表的中间节点 (1). 题 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表…...
kubeadm引导欧拉系统高可用的K8S1.28.X
文章目录 一. 核心组件架构二. 有状态与无状态应用三. 资源对象3.1 规约与状态3.2 资源的分类-元数据,集群,命名空间3.2.1 元数据3.2.2 集群资源 3.3 命名空间级3.3.1 pod3.3.2 pod-副本集3.3.3 pod-控制器 四. Kubeadm安装k8s集群4.1 初始操作4.2 ~~所有节点安装Docker&#x…...
【信息学奥赛】字典的键和值对换
【信息学奥赛】字典的键和值对换 💖The Begin💖点点关注,收藏不迷路💖 输入一个字典,要求将该字典的键和值对换。(注意,字典中有键的值是重复的) 输入: 一行࿰…...
使用Django框架搭建Web应用
文章目录 简介安装Django创建一个Django项目创建一个Django应用编写视图配置URL运行开发服务器总结与拓展数据库集成管理后台表单处理模板引擎安全性 简介 Django 是一款基于 Python 语言的开源 Web 应用框架,采用了 MVC(模型-视图-控制器)设…...
我用Mybatis的方式封装了OLAP查询!
背景 相信做数据平台的朋友对OLAP并不陌生,主流的OLAP引擎有Clickhouse,Impala,Starrocks…以及公司二开的OLAP平台,本次要说的OLAP属于最后一种。 最近在做一个BI项目,业务背景很简单,就是一个数据展示平…...
golang rune类型解析,与byte,string对比,以及应用
Golang中的rune类型是一个32位的整数类型(int32),它是用来表示Unicode码点的。rune类型的值可以是任何合法的Unicode码点,它通常用来处理字符串中的单个字符。 在Golang中,字符常量使用单引号来表示,例如 a。使用单引号表示的字符…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...
