深入分析 Android Activity (一)
文章目录
- 深入分析 Android Activity (一)
- 1. `Activity` 的窗口管理
- 2. `Activity` 的生命周期管理
- onCreate
- onStart
- onResume
- onPause
- onStop
- onDestroy
- onRestart
- 3. `Activity` 与 `Fragment` 的交互
- 添加 Fragment
- Fragment 的生命周期
- 4. `Activity` 的任务和返回栈
- 5. 配置变化处理
- 总结
深入分析 Android Activity (一)
接下来我们会深入分析 Activity 的一些高级特性和内部实现,包括窗口管理、生命周期管理、以及与 Fragment 的交互。
1. Activity 的窗口管理
在 Android 中,每个 Activity 都与一个 Window 相关联。Window 是一个抽象的顶级视图,提供了绘制和事件处理的基本框架。通常情况下,Activity 使用 PhoneWindow 类,它是 Window 的一个具体实现。
当你调用 setContentView 方法时,实际上是通过 Window 设置 Activity 的布局:
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
}
PhoneWindow 的实现如下:
public class PhoneWindow extends Window {@Overridepublic void setContentView(int layoutResID) {// Inflate the layout and add it to the windowmLayoutInflater.inflate(layoutResID, mContentParent);}
}
2. Activity 的生命周期管理
Activity 的生命周期由 Android 系统管理。系统在适当的时候调用 Activity 的生命周期方法,以确保 Activity 能够正确响应用户和系统事件。以下是一些关键的生命周期事件的详细说明:
onCreate
onCreate 是 Activity 被创建时的第一个回调方法。通常在这里进行视图的初始化和数据的加载:
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Initialize views and data
}
onStart
onStart 方法在 Activity 即将可见时调用。可以在这里执行一些准备操作,比如启动动画等:
@Override
protected void onStart() {super.onStart();// Prepare the activity to be visible
}
onResume
onResume 方法在 Activity 即将与用户交互时调用。这里是让 Activity 真正进入前台,并开始交互的地方:
@Override
protected void onResume() {super.onResume();// Resume operations that were paused
}
onPause
onPause 方法在系统即将启动另一个 Activity 时调用。在这里可以保存数据和状态,释放资源等:
@Override
protected void onPause() {super.onPause();// Save state and release resources
}
onStop
onStop 方法在 Activity 不再可见时调用。这里可以进一步释放资源:
@Override
protected void onStop() {super.onStop();// Release more resources
}
onDestroy
onDestroy 方法在 Activity 被销毁前调用。通常用于最后的清理工作:
@Override
protected void onDestroy() {super.onDestroy();// Clean up resources
}
onRestart
onRestart 方法在 Activity 从停止状态重新启动前调用。通常用于恢复暂停的操作:
@Override
protected void onRestart() {super.onRestart();// Restore state if needed
}
3. Activity 与 Fragment 的交互
Fragment 是 Activity 中的可复用组件,具有自己的布局和生命周期。一个 Activity 可以包含多个 Fragment,每个 Fragment 都可以独立处理用户交互。
添加 Fragment
可以在 Activity 中动态添加 Fragment:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
MyFragment fragment = new MyFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
Fragment 的生命周期
Fragment 的生命周期与 Activity 类似,但有一些额外的方法来处理与 Activity 的交互:
onAttach(Activity activity): 当Fragment被附加到Activity时调用。onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState): 创建并返回Fragment的视图层次结构。onActivityCreated(Bundle savedInstanceState): 当Activity的onCreate方法已经返回时调用。onDestroyView(): 当Fragment的视图层次结构被移除时调用。
4. Activity 的任务和返回栈
Android 使用任务和返回栈(Back Stack)来管理 Activity 的导航。每个任务由一个栈(返回栈)来管理 Activity。Activity 被启动时,会被添加到任务的返回栈中。用户按下返回按钮时,系统会从返回栈中弹出当前的 Activity 并显示前一个 Activity。
可以通过 Intent 的 FLAG_ACTIVITY_* 标志来控制任务和返回栈的行为。例如:
Intent intent = new Intent(this, AnotherActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
5. 配置变化处理
当设备配置发生变化(如屏幕旋转、语言更改等),Activity 会被销毁并重新创建。可以通过 android:configChanges 属性来处理某些配置变化,避免 Activity 的销毁和重建:
<activity android:name=".MainActivity"android:configChanges="orientation|screenSize">
</activity>
在 Activity 中覆盖 onConfigurationChanged 方法来处理配置变化:
@Override
public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);// Handle configuration changes
}
总结
Android 的 Activity 设计复杂且强大,提供了管理应用界面和用户交互的丰富功能。通过理解其生命周期、窗口管理、与 Fragment 的交互、任务和返回栈的管理,以及配置变化处理,开发者可以创建高效、响应迅速且用户友好的应用程序。掌握这些知识对于构建稳定和可维护的 Android 应用至关重要。
| 欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |

相关文章:
深入分析 Android Activity (一)
文章目录 深入分析 Android Activity (一)1. Activity 的窗口管理2. Activity 的生命周期管理onCreateonStartonResumeonPauseonStoponDestroyonRestart 3. Activity 与 Fragment 的交互添加 FragmentFragment 的生命周期 4. Activity 的任务和返回栈5. 配置变化处理 总结 深入…...
Python 调整PDF文件的页面大小
在处理PDF文件时,我们可能会遇到这样的情况:原始PDF文档不符合我们的阅读习惯,或者需要适配不同显示设备等。这时,我们就需要及时调整PDF文档中的页面尺寸,以满足不同应用场景的需求。 利用Python语言的高效性和灵活性…...
支付功能、支付平台、支持渠道如何测试?
有学员提问:作为一个支付平台,接入了快钱、易宝或直连银行等多家的渠道,内在的产品流程是自己的。业内有什么比较好的测试办法,来测试各渠道及其支持的银行通道呢? 作为产品,我自己办了十几张银行卡方便测…...
永久代(Permanent Generation)和元空间(Metaspace)
永久代(Permanent Generation)和元空间(Metaspace)是Java虚拟机(JVM)内存管理中的两个概念,主要区别在于它们的实现方式和内存分配策略。 永久代(Permanent Generation)…...
前端面试题23-34
23. 说说你对 Promise 的理解 Promise 是 ECMAScript6 引入的一种异步编程解决方案,用于处理异步操作。它表示一个尚未完成但最终会结束的操作,具有三种状态:pending(进行中)、fulfilled(已完成࿰…...
Hadoop3:HDFS中DataNode与NameNode的工作流程
一、DataNode中的数据情况 数据位置 /opt/module/hadoop-3.1.3/data/dfs/data/current/BP-823420375-192.168.31.102-1714395693863/current/finalized/subdir0/subdir0块信息 每个块信息,由两个文件保存,xxx.meta保存的是数据长度、校验和、时间戳&am…...
MySQL(一) 库和表的基础操作
1. 数据库基础 1.1 什么是数据库 存储数据用文件就可以了,为什么还要弄个数据库? 文件保存数据有以下几个缺点: 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质:磁盘内存 为了解…...
python -【二】判断语句
判断语句 一、 布尔类型 True:真(1)False:假(0) 比较运算符 运算符实例1 1 True!1 ! 1 Flase<1 < 1 Flse>1 > 1 Flse<1 < 1 True>1 > 1 True b1 True b2 False print(f"b1值是{b1},类型是{type(b1)}") print(…...
高通Android 12/13 设置和获取ADB状态
/*** 设置ADB状态** param isEnable*/public void setADB(boolean isEnable) {Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ADB_ENABLED, isEnable ? 1 : 0);}/*** 获取ADB状态** return*/public boolean getADB() {return Settings.Global.getIn…...
存储器和CPU的连接与TCP的流量控制
存储器与CPU的连接 存储容量的拓展 (1)位拓展:增加存储字长 (2)字拓展 增加存储器字的数量 例题:设CPU有16根地址线,8根数据线,并用MREQ作为访问存储控制信号(低电平有效),WR作为…...
红蓝对抗提权篇之一文看懂提权
一、计算机中的权限 1.1 不同的权限系统 权限在不同的应用中有着不同的分类,与安全相关的大致上我们分为: 匿名访问权限 来宾权限 用户权限 管理员权限 系统权限 不同的权限对应的权力各不相同,我们对自己电脑一般是用户权限和管理员权限。…...
【Tlias智能学习辅助系统】01 准备工作
Tlias智能学习辅助系统 01 创建员工、部门表创建springboot工程,引入对应的起步依赖(web、mybatis、mysql驱动、lombok)准备 Mapper、Service、Controller 等基础结构MapperServiceControllerpojo封装类application.properties 接口开发规范 创建员工、部门表 -- 创…...
yq—2024/5/29—零钱兑换
代码实现: #define min(a, b) ((a) > (b) ? (b) : (a))int coinChange(int *coins, int coinsSize, int amount) {int dp[amount 1];// 初始化for (int i 0; i < amount 1; i) {dp[i] INT32_MAX;}dp[0] 0;// 01背包 -----先遍历物品,再遍历背…...
【 Quartz框架中各个表及其字段含义】
Quartz框架中各个表及其字段含义 Quartz是一个强大的任务调度框架,它通过在数据库中维护多张表来存储和管理任务信息。了解这些表的结构和字段含义,有助于我们更好地理解Quartz的工作原理,并在实际应用中进行有针对性的优化和管理。 想了解Quartz框架其他信息可以参考下面的博…...
SAP_SD模块 物料科目分配/成本简介
SAP系统各模块与财务都有个方面的集成。文本主要说明销售模块中的科目分配和成本的一个对应关系。 1、首先是在物料主数据上销售视图中的物料科目分配组,S1主营、S2材料等字段,物料销售的时候会将这个物料产生的记录到对应的科目中。 首先是物料主数据中…...
el-select 组件获取整个对象
法一:要获取整个对象的话,如果有列表就可以遍历列表,找到指定对象 let obj this.chainTaskList.find((item) > item.chainTaskNo e); if (obj) {this.form.storeNo obj.storeNo;this.form.storeName obj.couponVO.storeName; }或 fo…...
基础—SQL—DQL(数据查询语言)基础查询
一、引言 1、介绍: 分类全称描述DQL英文全称:Data Query Language(数据查询语言)主要是学习对数据库表中的记录进行查询的语句 2、讲解 日常的开发中或者对于一个正常的业务系统中,对于查询的操作次数是远远多于数据的增删改的频次。例如…...
【QT八股文】系列之篇章2 | QT的信号与槽机制及通讯流程
【QT八股文】系列之篇章2 | QT的信号与槽机制及通讯流程 前言2. 信号与槽信号与槽机制介绍/本质/原理,什么是Qt信号与槽机制?如何在Qt中使用?信号与槽机制原理,解析流程Qt信号槽的调用流程信号与槽机制的优缺点信号与槽机制需要注…...
excel表格里怎样不删除0,又不显示0呢?
在单元格里不显示0,大体上有这么几种方法: 1.设置单元格自定义格式 选中数据区域,鼠标右键,点一下设置单元格格式,选中数字,自定义,在右侧的类型栏,设置格式: [0]&quo…...
精准操控时间的艺术:JavaScript节流函数的深度探索与实践【含代码示例】
精准操控时间的艺术:JavaScript节流函数的深度探索与实践【含代码示例】 节流基础:概念与作用实现策略:案例展示案例一:基础定时器实现案例二:立即执行版本案例三:使用requestAnimationFrame实现动画节流 功…...
LM2596 DC-DC开关电源芯片的实战应用与优化设计
1. LM2596芯片基础与工作原理 LM2596这颗DC-DC降压芯片可以说是电子工程师的老朋友了,从工业设备到消费电子产品都能见到它的身影。我第一次用它是在大学做智能车项目时,需要把12V电池电压降到5V给单片机供电。当时对比了几款芯片后选择了LM2596…...
用Python脚本自动化Mininet拓扑测试:3个提升SDN实验效率的技巧
Python脚本自动化Mininet拓扑测试:3个提升SDN实验效率的技巧 在软件定义网络(SDN)的研究与开发中,Mininet作为轻量级网络仿真工具已成为行业标准。然而,随着实验复杂度的提升,手动配置拓扑和流表的方式往往…...
ssm+java2026年毕设桃花新村社区【源码+论文】
本系统(程序源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于新闻资讯管理系统的研究,现有研究主要以传统门户网站的新闻发布系统为主,专门针对中小型组织、企业…...
微信聊天记录数据备份与隐私保护完全指南:本地存储与聊天记录管理新方案
微信聊天记录数据备份与隐私保护完全指南:本地存储与聊天记录管理新方案 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_…...
告别格式困扰:WebPShop插件全场景应用方案
告别格式困扰:WebPShop插件全场景应用方案 【免费下载链接】WebPShop Photoshop plug-in for opening and saving WebP images 项目地址: https://gitcode.com/gh_mirrors/we/WebPShop 在数字设计与开发领域,WebP格式以其卓越的压缩效率成为优化图…...
三维任意形状随机骨料matlab生成:基于映射网格的属性赋予方法
三维任意形状随机骨料matlab生成,基于映射网格(背景网格法)进行骨料、砂浆、界面属性的赋予。在混凝土材料细观建模中,生成真实的三维骨料结构是个技术活。今天咱们就来聊聊如何用Matlab造出形状各异的随机骨料,再通过…...
痕迹的痕迹:从朱君鸿论牟宗三与林安梧看学术争论的自感根源
痕迹的痕迹:从朱君鸿论牟宗三与林安梧看学术争论的自感根源 岐金兰 --- 摘要 朱君鸿的文章《从“横摄系统”到“横摄归纵”》是对牟宗三与林安梧不同朱子观的比较研究。从AI元人文的视角看,这篇文章本身是一层“痕迹”——它是对牟宗三、林安梧痕迹的再痕…...
Qwen3.5-35B-A3B-AWQ-4bit企业落地应用:教育题图分析、医疗影像初筛、工业图纸解读
Qwen3.5-35B-A3B-AWQ-4bit企业落地应用:教育题图分析、医疗影像初筛、工业图纸解读 1. 多模态AI在企业场景的价值 在当今企业运营中,视觉内容处理已成为关键环节。教育机构需要快速分析教材插图,医疗机构面临海量影像筛查压力,工…...
OpenClaw技能商店:分享自定义nanobot模块开发经验
OpenClaw技能商店:分享自定义nanobot模块开发经验 1. 为什么需要自定义技能模块 去年夏天,当我第一次接触OpenClaw时,就被它的自动化能力所吸引。但很快我发现,官方提供的标准技能虽然强大,却无法完全满足我的个性化…...
VBA延时技术全解析:从基础Timer到高精度API的避坑指南
1. VBA延时技术入门:为什么需要精确控制时间? 在自动化办公场景中,VBA脚本经常需要控制操作节奏。比如批量处理Excel数据时,如果连续快速操作可能导致系统资源冲突;或者开发用户界面时需要实现按钮点击后的缓冲效果。这…...
