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
會隨著用戶操作的不同反復啟動和銷毀。