Android Studio:Application 和 Activity的区别
Application 和 Activity 是 Android 中非常重要的两个组件,它们分别负责不同的生命周期管理和应用的不同层次的操作。
Application是应用级别的生命周期管理,它在整个应用运行时只有一个实例,负责应用的全局初始化和资源管理。Activity是界面级别的生命周期管理,负责单个界面的显示和用户交互,具有较短的生命周期,随用户操作频繁变化。
下面是它们的主要区别:
1. 生命周期差异:
Application 类:
-
生命周期:
Application类的生命周期与整个应用的生命周期相同。当应用启动时,Application会被创建,并在应用的整个运行过程中存在,直到应用被退出或系统回收。也就是说,Application的生命周期只会执行一次。 -
关键方法:
onCreate():在应用启动时调用,适合进行全局的初始化操作,如初始化第三方库、全局资源、设置一些全局变量等。onTerminate():当应用退出时调用(但在大部分设备上不会调用,主要用于模拟器)。
例如:
Application可以用于在全局范围内维护数据、处理全局配置或管理网络请求的工具类。
Activity 类:
-
生命周期:
Activity类的生命周期与用户的交互紧密相关,每次用户启动新的Activity时,都会经历一系列生命周期方法的调用。每次Activity的创建、暂停、销毁等都会触发相应的生命周期方法。 -
关键方法:
onCreate():当Activity被创建时调用,通常用于界面的初始化和数据的准备。onStart():当Activity从不可见变为可见时调用,适用于界面的显示。onResume():当Activity即将处于前台时调用。onPause():当Activity失去焦点但仍可见时调用,通常用于暂停动画、保存数据等。onStop():当Activity不再可见时调用,适合释放不再需要的资源。onDestroy():当Activity被销毁时调用,适合进行资源清理。
例如:
Activity负责管理用户交互界面,每当用户进入该界面时,都会经过onCreate()、onStart()等一系列生命周期方法。
2. 存在范围不同:
-
Application:在应用生命周期内只有一个实例,适合存储全局的数据或状态。 -
Activity:每个Activity实例都有自己的生命周期,适合管理特定界面的数据和状态。例如:在一个应用中,你可能有多个
Activity,每个Activity对应不同的界面,而Application则是跨整个应用共享的资源。
3. 用途和角色不同:
-
Application:用于管理和维护应用级别的状态和资源。例如:- 全局初始化(如网络库、数据库、依赖注入容器等)。
- 应用配置(如全局的主题、语言等)。
- 处理跨
Activity的数据共享(例如缓存、全局变量等)。
-
Activity:用于展示和管理用户界面,处理与用户的交互。每个Activity负责显示一个界面,并管理与用户的互动。Activity也会根据用户的操作响应生命周期方法,决定是否需要更新 UI 或保存数据。
4. 资源管理和性能优化:
-
Application:由于Application存在于整个应用生命周期,因此它的资源消耗必须谨慎处理。过多的资源占用可能会影响整个应用的性能。Application适合初始化一些全局对象,但不应该进行与界面密切相关的操作。 -
Activity:每个Activity在用户进入时才会被创建,且在不再需要时会被销毁。对于内存消耗大的资源,Activity在其生命周期内管理得更细致,确保不占用过多的内存。
5. 跨界面通信:
-
Application:通过Application,你可以在不同的Activity间共享数据和状态。由于它的生命周期贯穿整个应用,所以可以用于存储全局共享的信息。 -
Activity:Activity主要处理与用户交互相关的界面和数据,它与其他Activity的通信通常依赖于Intent或通过Fragment、ViewModel等其他组件传递数据。
6. 销毁和回收:
-
Application:Application通常不会被销毁,除非系统因为资源紧张而回收内存时。在这种情况下,onTerminate()方法会被调用,但这种情况很少发生。 -
Activity:Activity是由系统根据用户的行为进行管理的。用户按下“返回”按钮或切换到其他Activity时,当前Activity可能会被销毁并回收,释放资源。
7.1 MyApplication 类:
Application 类负责全局初始化,只有一个实例,生命周期贯穿整个应用。这里,我们在 onCreate() 中初始化一些全局资源。
public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();// 应用启动时初始化全局资源Log.d("MyApplication", "onCreate() called - Application has started");}@Overridepublic void onTerminate() {super.onTerminate();// 应用退出时的清理工作Log.d("MyApplication", "onTerminate() called - Application is terminating");}
}
7.2 MainActivity 类:
Activity 类负责显示用户界面,它有多个生命周期方法,比如 onCreate()、onStart()、onResume()、onPause() 等。每当用户交互时,Activity 的生命周期会发生变化。
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); // 设置界面Log.d("MainActivity", "onCreate() called - Activity is created");}@Overrideprotected void onStart() {super.onStart();Log.d("MainActivity", "onStart() called - Activity is visible to the user");}@Overrideprotected void onResume() {super.onResume();Log.d("MainActivity", "onResume() called - Activity is in the foreground");}@Overrideprotected void onPause() {super.onPause();Log.d("MainActivity", "onPause() called - Activity is about to lose focus");}@Overrideprotected void onStop() {super.onStop();Log.d("MainActivity", "onStop() called - Activity is no longer visible");}@Overrideprotected void onDestroy() {super.onDestroy();Log.d("MainActivity", "onDestroy() called - Activity is being destroyed");}
}
7.3 AndroidManifest.xml 配置:
需要在 AndroidManifest.xml 文件中声明 MyApplication 作为 Application 类,并声明 MainActivity 作为启动 Activity。
<applicationandroid:name=".MyApplication" <!-- 指定使用自定义的 Application 类 -->android:icon="@mipmap/ic_launcher"android:label="@string/app_name"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
7.4 执行时的日志输出:
- 当你启动应用时,
MyApplication的onCreate()会首先调用,然后MainActivity的生命周期方法依次调用。 - 你可以查看 Logcat 输出,确认两个类的生命周期方法被调用的顺序。
7.5 日志输出示例:
假设你启动了应用,首先会看到 Application 的 onCreate() 被调用,然后随着 MainActivity 启动,你会看到以下日志:
D/MyApplication: onCreate() called - Application has started
D/MainActivity: onCreate() called - Activity is created
D/MainActivity: onStart() called - Activity is visible to the user
D/MainActivity: onResume() called - Activity is in the foreground
如果你暂停、停止或销毁 Activity,你会看到以下生命周期方法的调用:
D/MainActivity: onPause() called - Activity is about to lose focus
D/MainActivity: onStop() called - Activity is no longer visible
D/MainActivity: onDestroy() called - Activity is being destroyed
Application 只在应用启动时创建一次,而 Activity 会随着用户操作的不同反复启动和销毁。
相关文章:
Android Studio:Application 和 Activity的区别
Application 和 Activity 是 Android 中非常重要的两个组件,它们分别负责不同的生命周期管理和应用的不同层次的操作。 Application 是应用级别的生命周期管理,它在整个应用运行时只有一个实例,负责应用的全局初始化和资源管理。Activity 是…...
深入解析“Self-Contained”——从技术到日常的全方位应用
深入解析“Self-Contained”——从技术到日常的全方位应用 一、引言 在阅读技术文档、编程指南或产品说明时,你可能经常看到 self-contained 这个短语。例如: Our end goal is a self-contained project containing two parts. https://howistart.org/p…...
2024年12月 Scratch 图形化(一级)真题解析 中国电子学会全国青少年软件编程等级考试
202412 Scratch 图形化(一级)真题解析 中国电子学会全国青少年软件编程等级考试 一、单选题(共25题,共50分) 第 1 题 点击下列哪个按钮,可以将红框处的程序放大?( ) A. B. C. D. 标…...
llama.cpp GGML Quantization Type
llama.cpp GGML Quantization Type 1. GGML Quantization Type2. static const struct ggml_type_traits type_traits[GGML_TYPE_COUNT]3. Q#_K_M and Q#_KReferences 什么神仙妖魔,不过是他们禁锢异族命运的枷锁! GGUF https://huggingface.co/docs/hu…...
【深度学习框架】MXNet(Apache MXNet)
MXNet(Apache MXNet)是一个 高性能、可扩展 的 开源深度学习框架,支持 多种编程语言(如 Python、R、Scala、C 和 Julia),并能在 CPU、GPU 以及分布式集群 上高效运行。MXNet 是亚马逊 AWS 官方支持的深度学…...
游戏引擎学习第87天
当直接使用内存时,可能会发生一些奇怪的事情 在直接操作内存时,一些意外的情况可能会发生。由于内存实际上只是一个大块的空间,开发者可以完全控制它,而不像高级语言那样必须遵守许多规则,因此很容易发生错误。在一个…...
【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR
文章目录 指令格式(重点)1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…...
Qt展厅播放器/多媒体播放器/中控播放器/帧同步播放器/硬解播放器/监控播放器
一、前言说明 音视频开发除了应用在安防监控、视频网站、各种流媒体app开发之外,还有一个小众的市场,那就是多媒体展厅场景,这个场景目前处于垄断地位的软件是HirenderS3,做的非常早而且非常全面,都是通用的需求&…...
VSCode源码分析参考资料
VSCode Architecture Analysis - Electron Project Cross-Platform Best Practices 中文版 VSCode 架构分析 - Electron 项目跨平台最佳实践 Sihan Li博客上的vscode源码分析系列:分析了微服务架构、事件体系、资源管理、配置系统等 文召博客上的vscode 源码解析…...
html中的表格属性以及合并操作
表格用table定义,标签标题用caption标签定义;用tr定义表格的若干行;用td定义若干个单元格;(当单元格是表头时,用th标签定义)(th标签会略粗于td标签) table的整体外观取决…...
html的字符实体和颜色表示
在HTML中,颜色可以通过以下几种方式表示,以下是具体的示例: 1. 十六进制颜色代码 十六进制颜色代码以#开头,后面跟随6个字符,每两个字符分别表示红色、绿色和蓝色的强度。例如: • #FF0000:纯红…...
unordered_map/set的哈希封装
【C笔记】unordered_map/set的哈希封装 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】unordered_map/set的哈希封装前言一. 源码及框架分析二.迭代器三.operator[]四.使用哈希表封装unordered_map/set后言 前言 哈…...
运算符(C#)
运算符(C#) 算数运算符 - * / % //算数运算符// - * / %//这跟我们初中的运算符一样// 加号Console.WriteLine(12);//3int a 5 6;Console.WriteLine(a);//11// - 减号Console.WriteLine(6-3);//3int b 10 - 6;Console.WriteLine(b);//4// * 乘号Console.WriteL…...
idea中git的简单使用
提交,推送直接合并 合到哪个分支就到先切到哪个分支...
Fastdds学习分享_xtpes_发布订阅模式及rpc模式
在之前的博客中我们介绍了dds的大致功能,与组成结构。本篇博文主要介绍的是xtypes.分为理论和实际运用两部分.理论主要用于梳理hzy大佬的知识,对于某些一带而过的部分作出更为详细的阐释,并在之后通过实际案例便于理解。案例分为普通发布订阅…...
SQLite Update 语句详解
SQLite Update 语句详解 SQLite 是一款轻量级的数据库管理系统,以其简单、易用和高效的特点在全球范围内得到了广泛的应用。在 SQLite 中,UPDATE 语句是用于修改数据库表中记录的常用命令。本文将详细解析 SQLite 的 UPDATE 语句,包括其语法…...
【大数据技术】用户行为日志分析(python+hadoop+mapreduce+yarn+hive)
用户行为日志分析(python+hadoop+mapreduce+yarn+hive) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 本机PyCharm远程连接虚拟机Python 搭建完全分布式高可用大数据集群(MySQL+Hive)...
开发板上Qt运行的环境变量的三条设置语句的详解
在终端中运行下面三句命令用于配置开发板上Qt运行的环境变量: export QT_QPA_GENERIC_PLUGINStslib:/dev/input/event1 export QT_QPA_PLATFORMlinuxfb:fb/dev/fb0 export QT_QPA_FONTDIR/usr/lib/fonts/设置成功后可以用下面的语句检查设置成功没有 echo $QT_QPA…...
vue3中el-input无法获得焦点的问题
文章目录 现象两次nextTick()加setTimeout()解决结论 现象 el-input被外层div包裹了,设置autofocus不起作用: <el-dialog v-model"visible" :title"title" :append-to-bodytrue width"50%"><el-form v-model&q…...
语言月赛 202412【顽强拼搏奖的四种发法】题解(AC)
》》》点我查看「视频」详解》》》 [语言月赛 202412] 顽强拼搏奖的四种发法 题目描述 在 XCPC 竞赛里,会有若干道题目,一支队伍可以对每道题目提交若干次。我们称一支队伍对一道题目的一次提交是有效的,当且仅当: 在本次提交…...
使用 Kotlin 将 Vertx 和 Springboot 整合
本篇文章目的是将 Springboot 和 Vertx 进行简单整合。整合目的仅仅是为了整活,因为两个不同的东西整合在一起提升的性能并没有只使用 Vertx 性能高,因此追求高性能的话这是在我来说不推荐。而且他们不仅没有提高很多性能甚至增加了学习成本 一、整合流…...
自定义数据集 使用scikit-learn中svm的包实现svm分类
引入必要的库 import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.metrics import accuracy_score, classification_report 生成自定义数据集 X, y ma…...
python:如何播放 .spx 声音文件
.spx 是 Speex音频编解码器的文件扩展名,它是一种开源的、免费的音频编解码器,主要用于语音压缩和语音通信领域。spx 文件通常用于语音记录、VoIP应用、语音信箱等场景。 .mp3 是一种广泛使用的音频格式,它采用了有损压缩算法,可…...
php的使用及 phpstorm环境部署
php语法 环境搭建:在小皮中新建网站,注意先填写域名再点击选择根目录。 成功创建网站后,打开发现forbidden,因为新建的网站里是空的,需要新建index.php文件----> 在Phpstorm中左上角打开文件,打开那个文…...
有用的sql链接
『SQL』常考面试题(2——窗口函数)_sql的窗口函数面试题-CSDN博客 史上最强sql计算用户次日留存率详解(通用版)及相关常用函数 -2020.06.10 - 知乎 (zhihu.com) 1280. 学生们参加各科测试的次数 - 力扣(LeetCode&…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.27 NumPy+Pandas:高性能数据处理的黄金组合
2.27 NumPyPandas:高性能数据处理的黄金组合 目录 #mermaid-svg-x3ndEE4hrhO6WR6H {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-x3ndEE4hrhO6WR6H .error-icon{fill:#552222;}#mermaid-svg-x3ndEE4hr…...
第一个3D程序!
运行效果 CPP #include <iostream> #include <fstream> #include <string> #include <cmath>#include <GL/glew.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> #include <glm/gtc/…...
NeuralCF 模型:神经网络协同过滤模型
实验和完整代码 完整代码实现和jupyter运行:https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 NeuralCF 模型由新加坡国立大学研究人员于 2017 年提出,其核心思想在于将传统协同过滤方法与深度学习技术相结…...
第二十三章 MySQL锁之表锁
目录 一、概述 二、语法 三、特点 一、概述 表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。 对于表级锁,主要分为以下三类: 1. 表锁 2. 元数…...
【Uniapp-Vue3】获取用户状态栏高度和胶囊按钮高度
在项目目录下创建一个utils文件,并在里面创建一个system.js文件。 在system.js中配置如下代码: const SYSTEM_INFO uni.getSystemInfoAsync();// 返回状态栏高度 export const getStatusBarHeight ()> SYSTEM_INFO.statusBarHeight || 15;// 返回胶…...
