深入分析 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。使用单引号表示的字符…...

重学java 51.Collections集合工具类、泛型
"我已不在地坛,地坛在我" —— 《想念地坛》 24.5.28 一、Collections集合工具类 1.概述:集合工具类 2.特点: a.构造私有 b.方法都是静态的 3.使用:类名直接调用 4.方法: static <T> boolean addAll(collection<? super T>c,T... el…...

多语言印度红绿灯系统源码带三级分销代理功能
前端为2套UI,一套是html写的,一套是编译后的前端 后台功能很完善,带预设、首充返佣、三级分销机制、代理功能。 东西很简单,首页就是红绿灯的下注页面,玩法虽然单一,好在不残缺可以正常跑。...

HTML拆分与共享方式——多HTML组合技术
作者:私语茶馆 1.应用场景 如果是一个产品级的Web项目,往往非常多的页面部分是重复的(为保持风格一致),每个HTML页面将这些重复部分重新写一次,既带来极大的工作量,也造成后续修改不便。 因此会考虑到将一个HTML的不同部分拆分为多个HTML页面,利用类似Include方式包含…...

K8s集群之 存储卷 PV PVC
目录 默写 1 如何将pod创建在指定的Node节点上 2 污点的种类(在node上设置) 一 挂载存储 1 emptyDir存储卷 2 hostPath存储卷 ①在 node01 节点上创建挂载目录 ② 在 node02 节点上创建挂载目录 ③ 创建 Pod 资源 ④ 在master上检测一下:…...

“腾讯云 AI 代码助手”体验
一、“腾讯云 AI 代码助手”体验 1、注册账号并进行实名认证 2、进入开发环境 3、体验javascript简单函数 代码如下: //请写一个两个日期计算的函数 function dateDiff(date1, date2) {return date2.getTime() - date1.getTime(); } var date1 new Date("2…...

Django入门全攻略:从零搭建你的第一个Web项目
系列文章目录 努力ing Django入门全攻略:从零搭建你的第一个Web项目努力ing… 文章目录 系列文章目录前言一、Django1.0 框架介绍1.1 Django安装1.2 Django项目创建1.3 目录介绍 二、子应用2.1 子应用创建2.2 目录结构2.3 子应用注册2.4 子应用视图逻辑2.4.1 编写视…...

AI大模型日报#0529:杨红霞创业入局“端侧模型”、Ilya左膀右臂被Claude团队挖走
导读:AI大模型日报,爬虫LLM自动生成,一文览尽每日AI大模型要点资讯!目前采用“文心一言”(ERNIE 4.0)、“零一万物”(Yi-34B)生成了今日要点以及每条资讯的摘要。欢迎阅读࿰…...

达梦数据库
达梦数据库 达梦Docker部署 达梦Docker部署 1、下载链接 https://pan.baidu.com/s/1RI3Lg0ppRhCgUsThjWV6zQ?pwdjc62 2、docker启动命令 docker run -d -p 5236:5236 \ --restartalways \ --name dm8 \ -e LD_LIBRARY_PATH/app/dm8/bin \ -e LENGTH_IN_CHAR1 \ -e CASE_SENS…...

什么是Axios
2024年5月23日,周四上午 Axios 是一个基于Promise的HTTP客户端,用于浏览器和node.js环境。它提供了一个简单易用的API来发送HTTP请求,并支持Promise API,这使得异步请求变得容易处理。 Axios的一些主要特点包括: Pro…...

React 其他 Hooks
其他 Hooks useRef 可用于获取 DOM 元素 const ScrollRef useRef(null)ScrollRef.current useContext (先回顾一下之前的 Context 知识,借用之前 ppt 和源码) Hooks 中使用 useContext 来获取 context 的值 // 父组件创建 contextexpor…...