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() 中初始化一些全局资源。

java 复制代码
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        // 应用启动时初始化全局资源
        Log.d("MyApplication", "onCreate() called - Application has started");
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        // 应用退出时的清理工作
        Log.d("MyApplication", "onTerminate() called - Application is terminating");
    }
}

7.2 MainActivity 类:

Activity 类负责显示用户界面,它有多个生命周期方法,比如 onCreate()onStart()onResume()onPause() 等。每当用户交互时,Activity 的生命周期会发生变化。

java 复制代码
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); // 设置界面
        Log.d("MainActivity", "onCreate() called - Activity is created");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("MainActivity", "onStart() called - Activity is visible to the user");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("MainActivity", "onResume() called - Activity is in the foreground");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("MainActivity", "onPause() called - Activity is about to lose focus");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("MainActivity", "onStop() called - Activity is no longer visible");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("MainActivity", "onDestroy() called - Activity is being destroyed");
    }
}

7.3 AndroidManifest.xml 配置:

需要在 AndroidManifest.xml 文件中声明 MyApplication 作为 Application 类,并声明 MainActivity 作为启动 Activity

XML 复制代码
<application
    android: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 启动,你会看到以下日志:

XML 复制代码
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,你会看到以下生命周期方法的调用:

XML 复制代码
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 会随着用户操作的不同反复启动和销毁。

相关推荐
重生之我要当编程大佬13 小时前
关于打不开pycharm的解决方法(一)
ide·python·pycharm
林北北的霸霸14 小时前
django初识与安装
android·mysql·adb
WarPigs15 小时前
Visual Studio笔记
ide·笔记·visual studio
Java 码农15 小时前
MySQL EXPLAIN 详解与优化指南
android·mysql·adb
仟濹16 小时前
IDEA 软件下载 + 安装 | 操作步骤
java·ide·intellij-idea
schinber17 小时前
使用pycharm自带debug模式运行flask时报错
ide·pycharm·flask
ithicker18 小时前
Pycharm+Deepseek结合使用Continue插件无法返回中文产生乱码
ide·python·pycharm
stevenzqzq20 小时前
Android Hilt 入门教程_传统写法和Hilt写法的比较
android
wuwu_q20 小时前
用通俗易懂方式,详细讲讲 Kotlin Flow 中的 map 操作符
android·开发语言·kotlin
_李小白21 小时前
【Android FrameWork】第五天:init加载RC文件
android