当前位置: 首页 > news >正文

深入分析 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

onCreateActivity 的入口点,系统在创建 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 提供了 onSaveInstanceStateonRestoreInstanceState 方法来保存和恢复状态。

2.1 保存状态

onSaveInstanceStateActivity 即将被销毁时调用,用于保存临时状态信息。

@Override
protected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putString("key", "value");
}
2.2 恢复状态

onRestoreInstanceStateActivity 被重新创建后调用,用于恢复之前保存的状态信息。

@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

WindowActivity 管理视图的顶级窗口,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,以释放资源。因此,必须在 onSaveInstanceStateonRestoreInstanceState 中保存和恢复关键数据。

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具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&#xff0c;对我帮助很大。我想与…...

刷题笔记1:如何科学的限制数字溢出问题

LCR 192. 把字符串转换成整数 (atoi) - 力扣&#xff08;LeetCode&#xff09; 我们以力扣的此题目为例&#xff0c;简述在诸如大数运算等问题中如何限制数字溢出问题。 先来直接看看自己的处理方式&#xff1a; class Solution { public:int myAtoi(string str) {int pcur0;…...

社区供稿丨GPT-4o 对实时互动与 RTC 的影响

以下文章来源于共识粉碎机 &#xff0c;作者AI芋圆子 前面的话&#xff1a; GPT-4o 发布当周&#xff0c;我们的社区伙伴「共识粉碎机」就主办了一场主题为「GPT-4o 对实时互动与 RTC 的影响」讨论会。涉及的话题包括&#xff1a; GPT-4o 如何降低延迟&#xff08;VAD 模块可…...

基于Linux的文件操作(socket操作)

基于Linux的文件操作&#xff08;socket操作&#xff09; 1. 文件描述符基本概念文件描述符的定义&#xff1a;标准文件描述符&#xff1a;文件描述符的分配&#xff1a; 2. 文件描述符操作打开文件读取文件中的数据 在linux中&#xff0c;socket也被认为是文件的一种&#xff…...

C++面试题记录(网络)

TCP与UDP区别 1. TCP面向连接&#xff0c;UDP无连接&#xff0c;所以UDP数据传输效率更高 2.UDP可以支持一对一、一对多、多对一、多对多通信&#xff0c;TCP只能一对一 3. TCP需要在端系统维护连接状态&#xff0c;包括缓存&#xff0c;序号&#xff0c;确认号&#xff0c;…...

YoloV8改进策略:卷积篇|基于PConv的二次创新|附结构图|性能和精度得到大幅度提高(独家原创)

摘要 在PConv的基础上做了二次创新,创新后的模型不仅在精度和速度上有了质的提升,还可以支持Stride为2的降采样。 改进方法简单高效,需要发论文的同学不要错过! 论文指导 PConv在论文中的描述 论文: 下面我们展示了可以通过利用特征图的冗余来进一步优化成本。如图3所…...

图论(从数据结构的三要素出发)

文章目录 逻辑结构物理结构邻接矩阵定义性能分析性质存在的问题 邻接表定义性能分析存在的问题 十字链表(有向图)定义性能分析 邻接多重表(无向图)定义性能分析 数据的操作图的基本操作图的遍历广度优先遍历&#xff08;BFS&#xff09;算法思想和实现性能分析深度优先最小生成…...

spark相关知识

1.Spark的特点 Spark的设计遵循“一个软件栈满足不同应用场景”的理念&#xff0c;逐渐形成了一套完整的生态系统&#xff0c;既能够提供内存计算框架&#xff0c;也可以支持SQL即席查询、实时流式计算、机器学习和图计算等。 运行速度快&#xff0c;易使用&#xff0c;强大的技…...

K8S认证|CKA题库+答案| 12. 查看Pod日志

目录 12、查看Pod日志 CKA v1.29.0模拟系统 下载试用 题目&#xff1a; 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、提取错误日志 3&#xff09;、验证提取结果 12、查看Pod日志 CKA v1.29.0模拟系统 下载试用 题目&#xff1a; 您必须在以下C…...

【Java SE】 String、StringBuff和StringBuilder

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 字符串不可变性1.1 设计不可变1.2 修改字符串创建新对象1.3 为什么字符串不可变1.4 String类设计不可变的…...

产品经理-需求分析(三)

1. 需求分析 从业务的需要出发&#xff0c;确定业务目的和目标&#xff0c;将业务需求转为产品需求 1.1 业务需求 业务需求 业务动机 业务目标 就是最根本的动机和目标成果&#xff0c;通过这个需求解决特定的问题 1.2 产品需求 产品需求 解决方案 产品结构 产品流程…...

Linux 编译器gcc/g++使用

gcc/g同理 编译器运行过程 1. 预处理&#xff08;进行宏替换) gcc -E a.c -o a.i 预处理后还是c语言 -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面 告诉gcc&#xff0c;从现在开始进行程序的翻译&#xff0c;将预处理工作做完停下 2. 编译&#x…...

adam优化器计算过程(tensorflow)

一、adam原理 原理 应用 优点 缺点 二、手动实现 一步一步计算 三、使用tensorflow api实现 api使用 四、一个具体的深度学习的例子...

【数据结构与算法 | 链表篇】力扣876

1. 力扣876 : 链表的中间节点 (1). 题 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表…...

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…...

【信息学奥赛】字典的键和值对换

【信息学奥赛】字典的键和值对换 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 输入一个字典&#xff0c;要求将该字典的键和值对换。&#xff08;注意&#xff0c;字典中有键的值是重复的&#xff09; 输入&#xff1a; 一行&#xff0…...

使用Django框架搭建Web应用

文章目录 简介安装Django创建一个Django项目创建一个Django应用编写视图配置URL运行开发服务器总结与拓展数据库集成管理后台表单处理模板引擎安全性 简介 Django 是一款基于 Python 语言的开源 Web 应用框架&#xff0c;采用了 MVC&#xff08;模型-视图-控制器&#xff09;设…...

我用Mybatis的方式封装了OLAP查询!

背景 相信做数据平台的朋友对OLAP并不陌生&#xff0c;主流的OLAP引擎有Clickhouse&#xff0c;Impala&#xff0c;Starrocks…以及公司二开的OLAP平台&#xff0c;本次要说的OLAP属于最后一种。 最近在做一个BI项目&#xff0c;业务背景很简单&#xff0c;就是一个数据展示平…...

golang rune类型解析,与byte,string对比,以及应用

Golang中的rune类型是一个32位的整数类型(int32)&#xff0c;它是用来表示Unicode码点的。rune类型的值可以是任何合法的Unicode码点&#xff0c;它通常用来处理字符串中的单个字符。 在Golang中&#xff0c;字符常量使用单引号来表示&#xff0c;例如 a。使用单引号表示的字符…...

Adafruit Bluefruit模块DFU模式恢复与固件更新全攻略

1. 项目概述如果你正在玩Adafruit的Bluefruit系列蓝牙模块&#xff0c;比如UART Friend或者SPI Friend&#xff0c;并且某天它突然“变砖”了——连接不上、没反应&#xff0c;或者Arduino IDE里怎么也刷不进新程序&#xff0c;先别急着把它扔进抽屉吃灰。这种情况我遇到过不止…...

2026年冰袋吸水粉厂家大揭秘:选择指南与行业趋势题

随着冷链物流行业的快速发展&#xff0c;冰袋吸水粉作为冷链运输中不可或缺的保冷材料&#xff0c;其市场需求持续增长。然而&#xff0c;市场上冰袋吸水粉的质量参差不齐&#xff0c;如何选择一家值得信赖的厂家成为许多采购商关注的重点。本文将从行业背景、技术特点及市场趋…...

改进极限学习机的电池健康状态估计(WOA-ELM)附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 &#x1f34e;完整代码获取 定制创新 论文复现点击&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &…...

Arm Ethos-U NPU架构解析与性能优化实战

1. Arm Ethos-U NPU架构概述Arm Ethos-U系列神经网络处理器(NPU)是专为边缘计算和物联网设备设计的高效能AI加速器。作为Arm Cortex-M处理器的配套加速单元&#xff0c;它能够在极低功耗下提供强大的机器学习推理能力。Ethos-U采用高度优化的张量处理架构&#xff0c;支持8位、…...

基于CircuitPython的电机动态性能测试系统:从原理到实践

1. 项目概述与核心价值搞电机驱动&#xff0c;最怕的就是“凭感觉”。你手上有个直流有刷电机&#xff0c;数据手册上写着空载转速12000转&#xff0c;堵转扭矩50mNm&#xff0c;但实际装到你的机器人关节或者小车上&#xff0c;带上传动机构&#xff0c;性能到底怎么样&#x…...

零代码构建HomeKit运动检测系统:Adafruit IO与itsaSNAP实战指南

1. 项目概述&#xff1a;零代码构建HomeKit运动检测系统想给家里的走廊、储物间或者车库入口加个自动感应灯&#xff0c;但又不想折腾复杂的编程和服务器搭建&#xff1f;或者&#xff0c;你手头有一些非HomeKit原生设备&#xff0c;希望通过苹果的“家庭”App进行统一管理&…...

为Claude Code配置Taotoken密钥以解决访问限制与token不足问题

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为Claude Code配置Taotoken密钥以解决访问限制与token不足问题 对于经常使用Claude Code作为编程助手的开发者而言&#xff0c;直接…...

SHA-3:从海绵构造到KECCAK-p,深入解析新一代哈希函数核心

1. 为什么我们需要SHA-3&#xff1f; 记得我第一次接触哈希函数时&#xff0c;用的还是SHA-1。那时候做文件校验&#xff0c;用SHA-1生成个摘要&#xff0c;感觉既方便又安全。直到后来看到新闻说SHA-1被破解了&#xff0c;我才意识到密码学世界的变化有多快。这就是SHA-3诞生的…...

别再只会写脚本了!用Matlab APP Designer给你的数据分析做个可视化界面(附完整代码)

从脚本到交互式应用&#xff1a;用MATLAB APP Designer打造专业数据分析工具 在数据科学和工程领域&#xff0c;MATLAB一直是不可或缺的计算工具。然而&#xff0c;许多用户长期停留在命令行脚本的层面&#xff0c;未能充分发挥MATLAB的完整潜力。本文将带您突破这一局限&#…...

GDB断点管理保姆级指南:从查看、删改到批量操作,告别调试混乱

GDB断点管理保姆级指南&#xff1a;从查看、删改到批量操作&#xff0c;告别调试混乱 调试大型C/C项目时&#xff0c;断点管理往往成为工程师的痛点。想象一下&#xff0c;当你在一个包含数十个源文件的项目中设置了50多个断点&#xff0c;每次调试时都要在密密麻麻的断点列表中…...