前言
-
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的簡書
相關系列文章閱讀
Carson帶你學Android:學習方法
Carson帶你學Android:四大組件
Carson帶你學Android:自定義View
Carson帶你學Android:異步-多線程
Carson帶你學Android:性能優化
Carson帶你學Android:動畫
歡迎關注Carson_Ho的簡書
不定期分享關于安卓開發的干貨,追求短、平、快,但卻不缺深度。