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()
中初始化一些全局资源。
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 执行时的日志输出:
- 当你启动应用时,
MyApplication
的onCreate()
会首先调用,然后MainActivity
的生命周期方法依次调用。 - 你可以查看 Logcat 输出,确认两个类的生命周期方法被调用的顺序。
7.5 日志输出示例:
假设你启动了应用,首先会看到 Application
的 onCreate()
被调用,然后随着 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
会随着用户操作的不同反复启动和销毁。