深入分析 Android Activity (一)

news/2024/7/25 20:26:40/文章来源:https://blog.csdn.net/rjdeng/article/details/139174831

文章目录

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

onCreateActivity 被创建时的第一个回调方法。通常在这里进行视图的初始化和数据的加载:

@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. ActivityFragment 的交互

FragmentActivity 中的可复用组件,具有自己的布局和生命周期。一个 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): 当 ActivityonCreate 方法已经返回时调用。
  • onDestroyView(): 当 Fragment 的视图层次结构被移除时调用。
4. Activity 的任务和返回栈

Android 使用任务和返回栈(Back Stack)来管理 Activity 的导航。每个任务由一个栈(返回栈)来管理 ActivityActivity 被启动时,会被添加到任务的返回栈中。用户按下返回按钮时,系统会从返回栈中弹出当前的 Activity 并显示前一个 Activity

可以通过 IntentFLAG_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 应用至关重要。

欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1054237.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【实用的 IDEA 配置和操作技巧总结】

前置知识 IDEA的设置快捷键为ctrlalts键&#xff0c;后文介绍IDEA常见的配置就不再赘述这一点了。 基础配置 取消默认打开上次项目 日常开发都会打开不同的项目&#xff0c;初次安装IDEA之后&#xff0c;每次打开IDEA都会开启上一次启动的项目&#xff0c;所以我们需要进入设…

微软MSBuild大会发布Copilot+PC:技术革新还是隐私噩梦?

微软在最近的MSBuild 2024大会上发布了全新的CopilotPC概念&#xff0c;这一技术结合了高通骁龙X Elite芯片&#xff0c;将人工智能与PC紧密结合。此次发布引起了广泛关注&#xff0c;不仅是因为其技术创新&#xff0c;还因为潜在的隐私问题。甚至连Elon Musk也对此表示担忧&am…

Springboot项目——网页版本五子棋

网页五子棋&#xff1a;本项目简单实现了网页版本的五子棋对战功能&#xff0c;同时会根据用户的天梯分数来匹配&#xff0c;可供多位用户同时提供对战功能。大致可分为三个模块&#xff0c;用户模块&#xff0c;匹配模块&#xff0c;对战模块&#xff0c;下面重点介绍以下三个…

一款220V降12V恒压芯片电路原理图WT5114

一款220V降12V恒压芯片电路原理图WT5114&#xff0c;电路图简示如下&#xff1a; 一款220V降12V恒压芯片线路图WT5114 WT5114是一款高性能、高精度、低成本的PWM电源开关&#xff0c;适用于非隔离降压和反激式应用。它集成了专用电流模式PWM控制器&#xff08;采用SOP8封装的高…

【机器学习300问】102、什么是混淆矩阵?

一、混淆矩阵的定义 混淆矩阵是一种用于评估分类模型性能的评估指标。当模型对数据进行预测并将数据分配到预定义的类别时&#xff0c;混淆矩阵提供了一种直观的方式来总结这些预测与数据实际类别之间的对应关系。具体来说&#xff0c;它是一个表格。 二、分类模型性能评估一级…

SWM181系列应用

一、SWM181系列 ISP功能 1.1、注意&#xff1a;ISP引脚为B0&#xff0c;VCC&#xff0c;GND是UART-RX、UART-TX 下载引脚。所有型号的UART-RX - - > A0&#xff0c;UART-TX - - > A1。 1.2、注意&#xff1a;板级设计必须留出ISP引脚&#xff0c;防止调试过程中芯片锁死后…

【赠书第25期】C#项目开发实战(微视频版)

文章目录 前言 1 项目构思与需求分析 1.1 项目构思 1.2 需求分析 2 系统设计 2.1 系统架构设计 2.2 数据库设计 2.3 接口设计 3 编码实现 3.1 环境搭建 3.2 编码规范 3.3 编码实现 4 测试与部署 4.1 单元测试 4.2 系统测试 4.3 部署与上线 5 总结与展望 6 推…

LeetCode刷题之HOT100之三数之和

2024/5/29 天气真他妈好呀&#xff01;好天气让我舒畅&#xff0c;可惜俺今天把我养护了两三个月的栀子花花苞又整掉了一朵&#xff0c;呜呜呜&#xff01;看着它们一天天长大&#xff0c;花苞边由嫩绿泛白&#xff0c;结果被我不小心弄掉了&#xff0c;我是罪人。它们还想&…

K8s service 进阶

文章目录 K8s service 进阶Service 工作逻辑Service 具体实现Service 资源类型ClusterIPNodePortLoadBalancerExternalName Service 与 EndpointEndpoint 与 容器探针自定义Endpoint Service 相关字段sessionAffinityexternalTrafficPolicyinternalTrafficPolicypublishNotRead…

学习笔记——动态路由协议——OSPF(OSPF区域)

四、OSPF区域 OSPF路由器在同一个区域(Area)内网络中泛红LSA(链路状态通告)。为了确保每台路由器都拥有对网络拓扑的一致认知&#xff0c;LSDB需要在区域内进行同步。如果OSPF域仅有一个区域&#xff0c;随着网络规模越来越大&#xff0c;LSDB越来越庞大&#xff0c;OSPF路由器…

【MySQL数据库】 MySQL主从复制

MySQL主从复制 MySQL主从复制主从复制与读写分离的意义主从数据库实现同步&#xff08;主从复制&#xff09;三台mysql服务器搭建主从复制&#xff0c;要求不可以用root帐号同步&#xff0c;要求第三台服务器在测试过1、2的主从复制之后进行主从复制配置 MySQL主从复制 主从复…

SQL学习小记(三)

SQL学习小记&#xff08;三&#xff09; 功能实现思路代码部分名词解释 代码打包为可执行文件 功能说明&#xff1a;使用python代码&#xff0c;将数据库database1中的表格table1同步到数据库database2中 功能实现 思路 #mermaid-svg-R1pWrEWA799M299a {font-family:"tre…

计算机组成原理----原码,反码与补码

1.原码的出现 我们通常使用"","-"判断数字的正负,而在计算机中,则将二进制的首位当作标记符号,"0"表示正数,"1"表示负数,这样就解决了在计算机中表示数值正负的问题,唯一的缺点就是第1位被占作符号位。 0 0000001 原 0 0000010 原 …

密码学基础概念

加密性 什么是加密&#xff1f; 1.对原有的明文数据&#xff0c;执行某种运算&#xff0c;得到密文数据。 2.密文数据对于未授权人员而言&#xff0c;在一定上程度上加大了解读的难度 3.加密功能用于实现机密性 什么是密钥&#xff1f; 1.如同持有保险柜钥匙才能打开保险柜…

如何在Spring Boot中整合PageHelper实现分页功能

1.前言 在开发web应用程序时&#xff0c;经常会遇到需要对数据库中的数据进行分页查询的情况。为了简化分页查询的实现过程&#xff0c;我们可以利用PageHelper这个优秀的分页插件来实现分页功能。本文将介绍如何在Spring Boot项目中整合PageHelper&#xff0c;并演示如何使用它…

Thinkphp3.2.3网站后台不能访问如何修复

我是使用Thinkphp3.2.3新搭建的PHP网站&#xff0c;但是网站前台可以访问&#xff0c;后台访问出现如图错误&#xff1a; 由于我使用的Hostease的Linux虚拟主机产品默认带普通用户权限的cPanel面板&#xff0c;对于上述出现的问题不清楚如何处理&#xff0c;因此联系Hostease的…

深入分析 Android Activity (十一)

文章目录 深入分析 Android Activity (十一)1. Activity 的内存管理和优化1.1 内存泄漏的常见原因1.2 避免内存泄漏的方法1.3 内存泄漏检测工具 2. Activity 的配置变更处理2.1 处理配置变更2.2 保存和恢复状态2.3 使用 ViewModel 3. Activity 的测试3.1 单元测试3.2 UI 测试 4…

Centos安装nvm管理node版本(让安装变得可控又快捷)

Centos安装nvm管理node版本&#xff08;让安装变得可控又快捷&#xff09; 没有找到一个对的人&#xff0c;有可能是你没有走对那条路&#xff0c;也有可能是你没有睁开眼睛&#xff0c;而更大的可能是&#xff0c;你根本就没有出发去找。 安装说明 nvm安装目录&#xff1a;/us…

[ue5]建模场景学习笔记(1)——混合材质

卷首&#xff1a;这部分会记录建模场景等相关学习内容&#xff0c;与ue引擎学习笔记不同的是&#xff0c;可能会略过一些基础内容&#xff0c;因为部分知识在blender中已经学习过了&#xff0c;不再继续记录。 1.需求分析&#xff1a; 想构建一个山地的场景&#xff0c;在ue5中…

为什么要学习c++?

你可能在想&#xff0c;“C&#xff1f;那不是上个时代的产物吗&#xff1f;” 哎呀&#xff0c;可别小看了这位“老将”&#xff0c;它在21世纪的科技舞台上依旧光芒万丈&#xff0c;是许多尖端技术不可或缺的基石&#xff01; 1. 无可替代 c源于c语言&#xff0c;它贴近于硬…