深入分析 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实现动画节流 功…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...