前言
Applicaiton
類在Android
開發中非常常見,可是你真的瞭解Applicaiton
類嗎?- 本文將全面解析
Applicaiton
類,包括特點、方法介紹、應用場景和具體使用,希望你們會喜歡。
目錄
1. 定義
- 代表應用程式(即
Android App
)的類,也屬於Android
中的一個系統元件 - 繼承關係:繼承自
ContextWarpper
類
2. 特點
2.1 例項建立方式:單例模式
- 每個
Android App
執行時,會首先自動建立Application
類並例項化Application
物件,且只有一個
即
Application
類 是單例模式(singleton
)類
- 也可通過 繼承
Application
類自定義Application
類和例項
2.2 例項形式:全域性例項
即不同的元件(如Activity、Service
)都可獲得Application
物件且都是同一個物件
2.3 生命週期:等於 Android App 的生命週期
Application
物件的生命週期是整個程式中最長的,即等於Android App
的生命週期
3. 方法介紹
那麼,該 Application
類有什麼作用呢?下面,我將介紹Application
類的方法使用
3.1 onCreate()
- 呼叫時刻:
Application
例項建立時呼叫
Android
系統的入口是Application
類的onCreate()
,預設為空實現
- 作用
- 初始化 應用程式級別 的資源,如全域性物件、環境配置變數、圖片資源初始化、推送服務的註冊等
注:請不要執行耗時操作,否則會拖慢應用程式啟動速度
- 資料共享、資料快取 設定全域性共享資料,如全域性共享變數、方法等
注:這些共享資料只在應用程式的生命週期內有效,當該應用程式被殺死,這些資料也會被清空,所以只能儲存一些具備 臨時性的共享資料
- 具體使用
// 複寫方法需要在Application子類裡實現
private static final String VALUE = "Carson";
// 初始化全域性變數
@Override
public void onCreate()
{
super.onCreate();
VALUE = 1;
}
}
複製程式碼
3.2 registerComponentCallbacks() & unregisterComponentCallbacks()
- 作用:註冊和登出
ComponentCallbacks2
回撥介面
本質上是複寫
ComponentCallbacks2
回撥介面裡的方法從而實現更多的操作,具體下面會詳細介紹
- 具體使用
registerComponentCallbacks(new ComponentCallbacks2() {
// 介面裡方法下面會繼續介紹
@Override
public void onTrimMemory(int level) {
}
@Override
public void onLowMemory() {
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
}
});
複製程式碼
3.3 onTrimMemory()
- 作用:通知 應用程式 當前記憶體使用情況(以記憶體級別進行識別)
Android 4.0
後提供的一個API
- 應用場景:根據當前記憶體使用情況進行自身的記憶體資源的不同程度釋放,以避免被系統直接殺掉 & 優化應用程式的效能體驗
- 系統在記憶體不足時會按照
LRU Cache
中從低到高殺死程式;優先殺死佔用記憶體較高的應用- 若應用佔用記憶體較小 = 被殺當機率降低,從而快速啟動(即熱啟動 = 啟動速度快)
- 可回收的資源包括: a. 快取,如檔案快取,圖片快取 b. 動態生成 & 新增的View
典型的應用場景有兩個:
- 具體使用
registerComponentCallbacks(new ComponentCallbacks2() {
@Override
public void onTrimMemory(int level) {
// Android系統會根據當前記憶體使用的情況,傳入對應的級別
// 下面以清除快取為例子介紹
super.onTrimMemory(level);
. if (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE) {
mPendingRequests.clear();
mBitmapHolderCache.evictAll();
mBitmapCache.evictAll();
}
});
複製程式碼
- 可回撥物件 & 對應方法
Application.onTrimMemory()
Activity.onTrimMemory()
Fragment.OnTrimMemory()
Service.onTrimMemory()
ContentProvider.OnTrimMemory()
複製程式碼
特別注意:onTrimMemory()
中的TRIM_MEMORY_UI_HIDDEN
與onStop()
的關係
onTrimMemory()
中的TRIM_MEMORY_UI_HIDDEN
的回撥時刻:當應用程式中的所有UI元件全部不可見時Activity
的onStop()
回撥時刻:當一個Activity完全不可見的時候- 使用建議:
- 在
onStop()中
釋放與Activity
相關的資源,如取消網路連線或者登出廣播接收器等 - 在
onTrimMemory()
中的TRIM_MEMORY_UI_HIDDEN
中釋放與UI
相關的資源,從而保證使用者在使用應用程式過程中,UI
相關的資源不需要重新載入,從而提升響應速度
- 在
注:
onTrimMemory
的TRIM_MEMORY_UI_HIDDEN
等級是在onStop()
方法之前呼叫
的
3.4 onLowMemory()
- 作用:監聽
Android
系統整體記憶體較低時刻 - 呼叫時刻:
Android
系統整體記憶體較低時
registerComponentCallbacks(new ComponentCallbacks2() {
@Override
public void onLowMemory() {
}
});
複製程式碼
- 應用場景:
Android 4.0
前 檢測記憶體使用情況,從而避免被系統直接殺掉 & 優化應用程式的效能體驗
類似於
OnTrimMemory()
- 特別注意:
OnTrimMemory()
&OnLowMemory()
關係OnTrimMemory()
是OnLowMemory()
Android 4.0
後的替代API
OnLowMemory()
=OnTrimMemory()
中的TRIM_MEMORY_COMPLETE
級別- 若想相容
Android 4.0
前,請使用OnLowMemory()
;否則直接使用OnTrimMemory()
即可
3.5 onConfigurationChanged()
- 作用:監聽 應用程式 配置資訊的改變,如螢幕旋轉等
- 呼叫時刻:應用程式配置資訊 改變時呼叫
- 具體使用
registerComponentCallbacks(new ComponentCallbacks2() {
@Override
public void onConfigurationChanged(Configuration newConfig) {
...
}
});
複製程式碼
- 該配置資訊是指 :
Manifest.xml
檔案下的Activity
標籤屬性android:configChanges
的值,如下:
<activity android:name=".MainActivity">
android:configChanges="keyboardHidden|orientation|screenSize"
// 設定該配置屬性會使 Activity在配置改變時不重啟,只執行onConfigurationChanged()
// 上述語句表明,設定該配置屬性可使 Activity 在螢幕旋轉時不重啟
</activity>
複製程式碼
3.6 registerActivityLifecycleCallbacks() & unregisterActivityLifecycleCallbacks()
- 作用:註冊 / 登出對 應用程式內 所有
Activity
的生命週期監聽 - 呼叫時刻:當應用程式內
Activity
生命週期發生變化時就會呼叫
實際上是呼叫
registerActivityLifecycleCallbacks()
裡ActivityLifecycleCallbacks
介面裡的方法
- 具體使用
// 實際上需要複寫的是ActivityLifecycleCallbacks介面裡的方法
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
Log.d(TAG,"onActivityCreated: " + activity.getLocalClassName());
}
@Override
public void onActivityStarted(Activity activity) {
Log.d(TAG,"onActivityStarted: " + activity.getLocalClassName());
}
@Override
public void onActivityResumed(Activity activity) {
Log.d(TAG,"onActivityResumed: " + activity.getLocalClassName());
}
@Override
public void onActivityPaused(Activity activity) {
Log.d(TAG,"onActivityPaused: " + activity.getLocalClassName());
}
@Override
public void onActivityStopped(Activity activity) {
Log.d(TAG, "onActivityStopped: " + activity.getLocalClassName());
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
Log.d(TAG,"onActivityDestroyed: " + activity.getLocalClassName());
}
});
<-- 測試:把應用程式從前臺切到後臺再開啟,看Activcity的變化 -->
onActivityPaused: MainActivity
onActivityStopped: MainActivity
onActivityStarted: MainActivity
onActivityResumed: MainActivity
複製程式碼
3.7 onTerminate()
呼叫時刻:應用程式結束時呼叫
但該方法只用於
Android
模擬機測試,在Android
產品機是不會呼叫的
4. 應用場景
從Applicaiton
類的方法可以看出,Applicaiton
類的應用場景有:(已按優先順序排序)
- 初始化 應用程式級別 的資源,如全域性物件、環境配置變數等
- 資料共享、資料快取,如設定全域性共享變數、方法等
- 獲取應用程式當前的記憶體使用情況,及時釋放資源,從而避免被系統殺死
- 監聽 應用程式 配置資訊的改變,如螢幕旋轉等
- 監聽應用程式內 所有Activity的生命週期
5. 具體使用
- 若需要複寫實現上述方法,則需要自定義
Application
類 - 具體過程如下
步驟1:新建Application子類
即繼承 Application
類
public class CarsonApplication extends Application
{
...
// 根據自身需求,並結合上述介紹的方法進行方法複寫實現
// 下面以onCreate()為例
private static final String VALUE = "Carson";
// 初始化全域性變數
@Override
public void onCreate()
{
super.onCreate();
VALUE = 1;
}
}
複製程式碼
步驟2:配置自定義的Application子類
在Manifest.xml
檔案中 <application>
標籤裡進行配置
Manifest.xml
<application
android:name=".CarsonApplication"
// 此處自定義Application子類的名字 = CarsonApplication
</application>
複製程式碼
步驟3:使用自定義的Application類例項
private CarsonApplicaiton app;
// 只需要呼叫Activity.getApplication() 或Context.getApplicationContext()就可以獲得一個Application物件
app = (CarsonApplication) getApplication();
// 然後再得到相應的成員變數 或方法 即可
app.exitApp();
複製程式碼
至此,關於 Applicaiton
類已經講解完畢。
6. 總結
- 我用一張圖總結上述文章
- 下面我將繼續對
Android
中的知識進行深入講解 ,有興趣可以繼續關注Carson_Ho的安卓開發筆記