標籤:儲存 city 重啟 不可 ui組件 例子 cycle idt package
前言
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:全面解析 熟悉而陌生 的Application類使用