Android Studio:Application 和 Activity的区别

ApplicationActivity 是 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 间共享数据和状态。由于它的生命周期贯穿整个应用,所以可以用于存储全局共享的信息。

  • ActivityActivity 主要处理与用户交互相关的界面和数据,它与其他 Activity 的通信通常依赖于 Intent 或通过 FragmentViewModel 等其他组件传递数据。

6. 销毁和回收:

  • ApplicationApplication 通常不会被销毁,除非系统因为资源紧张而回收内存时。在这种情况下,onTerminate() 方法会被调用,但这种情况很少发生。

  • ActivityActivity 是由系统根据用户的行为进行管理的。用户按下“返回”按钮或切换到其他 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  执行时的日志输出:

  • 当你启动应用时,MyApplicationonCreate() 会首先调用,然后 MainActivity 的生命周期方法依次调用。
  • 你可以查看 Logcat 输出,确认两个类的生命周期方法被调用的顺序。

7.5 日志输出示例:

     假设你启动了应用,首先会看到 ApplicationonCreate() 被调用,然后随着 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 会随着用户操作的不同反复启动和销毁。

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

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

相关文章

Mac本地体验LM studio

博主很懒&#xff0c;不爱打字&#xff01; 1、LM studio官网&#xff1a;LM Studio - Discover, download, and run local LLMs 2、下载DMG文件&#xff0c;安装 3、使用vscode工具&#xff0c;commandshiftH【全局替换功能】&#xff0c;选择目录/Applications/LM\ Studio…

SQL Server 数据库备份指南

SQL Server备份是数据库维护的日常工作。备份的目的是在发生数据丢失、损坏甚至硬件故障时将数据库和事务日志恢复到最近的时间点。您可以借助专业的SQL Server备份软件,操作起来更方便。前提需要安装SQL Server Management Studio (SSMS)工具。 对于 SQL 数据库备份,有多种…

我最近在干什么【2】

前言 这系列的上一篇是2024.12.05写的&#xff0c;现在是2025.02.06&#xff0c;这都两个月&#x1f914;小久。 不是完整全面的技术分享&#xff0c;话题聚焦个人成长&#xff08;学的技术、了解到的信息、看的书……&#xff09; 方面。文章偏意识流点&#xff0c;单纯分享我…

Temperature、Top-P、Top-K、Frequency Penalty详解

在生成式AI&#xff08;比如ChatGPT&#xff09;中&#xff0c;Temperature、Top-P、Top-K、Frequency Penalty 这些参数用于控制文本生成的多样性、随机性和重复度&#xff0c;它们的作用如下&#xff1a; 1. Temperature&#xff08;温度&#xff09; 作用&#xff1a;控制输…

4. Go结构体使用

1、结构体的简介 结构体&#xff08;Struct&#xff09;是编程语言中常见的一种复合数据类型&#xff0c;它将不同类型的数据元素&#xff08;成员&#xff09;组合成一个单一的实体。通过结构体&#xff0c;程序员可以将具有不同类型和性质的信息绑定到一个对象中&#xff0c…

sqlite 查看表结构

在SQLite中&#xff0c;查看表结构通常有以下几种方法&#xff1a; 使用.schema命令 在SQLite的命令行界面中&#xff0c;你可以使用.schema命令加上表名来查看该表的结构。例如&#xff0c;如果你想查看名为your_table_name的表结构&#xff0c;你可以这样做&#xff1a; .s…

SpringAI介绍及本地模型使用方法

博客原文地址 前言 Spring在Java语言中一直稳居高位&#xff0c;与AI的洪流碰撞后也产生了一些有趣的”化学反应“&#xff0c;当然你要非要说碰撞属于物理反应也可以&#xff0c; 在经历了一系列复杂的反应方程后&#xff0c;Spring家族的新成员——SpringAI&#xff0c;就…

ip地址是手机号地址还是手机地址

在数字化生活的浪潮中&#xff0c;IP地址、手机号和手机地址这三个概念如影随形&#xff0c;它们各自承载着网络世界的独特功能&#xff0c;却又因名称和功能的相似性而时常被混淆。尤其是“IP地址”这一术语&#xff0c;经常被错误地与手机号地址或手机地址划上等号。本文旨在…

车载以太网__传输层

车载以太网中&#xff0c;传输层和实际用的互联网相差无几。本篇文章对传输层中的IP进行介绍 目录 什么是IP&#xff1f; IP和MAC的关系 IP地址分类 私有IP NAT DHCP 为什么要防火墙穿透&#xff1f; 广播 本地广播 直接广播 本地广播VS直接广播 组播 …

Docker 数据卷(Volume)详细介绍

Docker 数据卷&#xff08;Volume&#xff09;详细介绍 1. 什么是 Docker 数据卷&#xff1f; Docker 数据卷&#xff08;Volume&#xff09;是一种用于 持久化数据 和 容器间数据共享 的机制。由于容器的存储是临时的&#xff0c;容器删除后其中的数据会丢失&#xff0c;因此…

wxWidgets生成HTML文件,带图片转base64数据

编译环境大家可以看我之前的文章,CodeBlocks + msys2 + wx3.2,win10 这里功能就是生成HTML文件,没用HTML库,因为是自己固定的格式,图片是一个vector,可以动态改变数量的。 效果如下: #include <wx/string.h> #include <wx/file.h> #include <wx/ima…

网络原理一>数据链路层协议->以太网协议

目录 以太网协议的结构&#xff1a;类型&#xff1a;ARP请求应答报文&#xff1a;CRC&#xff1a;MTU: 为什么需要mac地址&#xff1a;mac地址和IP地址的区别&#xff1a; 以太网协议的结构&#xff1a; 以太网是数据链路层和物理层的主要协议 源IP&#xff0c;目的IP就不多说…

疯狂SQL转换系列- SQL for Milvs2.4

鉴于Milvus仍在不停的迭代新版本&#xff0c;推出新功能&#xff0c;其SDK目前并不稳定。目前其2.4版本的SDK接口已与之前的2.2版本有了较大的差别&#xff0c;功能上也有了一定的调整。为此&#xff0c;我们重新提供了针对[Milvus2.4](https://github.com/colorknight/moql-tr…

售后板子HDMI无输出分析

问题&#xff1a; 某产品售后有1例HDMI无输出。 分析&#xff1a; 1、测试HDMI的HPD脚&#xff08;HDMI座子的19pin&#xff09;&#xff0c;测试电压4.5V&#xff0c;属于正常。 2、用万用表直流电压档&#xff0c;测试HDMI的3对数据脚和1对时钟脚&#xff08;板子通过HDM…

【声音转文字CapsWriter】声音随时转化为文字,CapsWriter提高工作效率

文章目录 前言1. 软件与模型下载2. 本地使用测试3. 异地远程使用3.1 内网穿透工具下载安装3.2 配置公网地址3.3 修改config文件3.4 异地远程访问服务端 4. 配置固定公网地址4.1 修改config文件 5. 固定tcp公网地址远程访问服务端 前言 今天我要给大家安利一个神器——CapsWrit…

使用 Python 编程语言来实现机器学习小项目教程案例

以下是一个简单的机器学习小项目教程案例,使用 Python 编程语言和 Scikit-learn 库来实现一个分类任务。我们将使用经典的鸢尾花(Iris)数据集来训练一个分类器,预测鸢尾花的种类。 项目目标 使用机器学习算法对鸢尾花数据集进行分类,预测鸢尾花的类别(Setosa、Versicolor…

DKG(Distributed Key Generation)协议

一、DKG是什么 DKG(分布式密钥生成)提供了一种去中心化的方法,使各个参与方在不相互信任的情况下生成共享密钥,以确保安全通信和多方参与的机密性。 DKG技术的关键思想是使用多方计算(secure multiparty computation)和秘钥共享(secret sharing)的概念。 秘钥共享 则…

十二、Docker Compose 部署 SpringCloudAlibaba 微服务

一、部署基础服务 0、项目部署结构 项目目录结构如下: /home/zhzl_hebei/ ├── docker-compose.yml └── geochance-auth/└── Dockerfile└── geochance-auth.jar └── geochance-system/└── Dockerfile└── geochance-system.jar └── geochance-gateway/…

使用 Docker(Podman) 部署 MongoDB 数据库及使用详解

在现代开发环境中&#xff0c;容器化技术&#xff08;如 Docker 和 Podman&#xff09;已成为部署和管理应用程序的标准方式。本文将详细介绍如何使用 Podman/Docker 部署 MongoDB 数据库&#xff0c;并确保其他应用程序容器能够通过 Docker 网络成功连接到 MongoDB。我们将逐步…

Games104——游戏引擎Gameplay玩法系统:基础AI

这里写目录标题 寻路/导航系统NavigationWalkable AreaWaypoint NetworkGridNavigation Mesh&#xff08;寻路网格&#xff09;Sparse Voxel Octree Path FindingDijkstra Algorithm迪杰斯特拉算法A Star&#xff08;A*算法&#xff09; Path Smoothing Steering系统Crowd Simu…