
前言
-
Applicaiton類在Android開發(fā)中非常常見,可是你真的了解Applicaiton類嗎? - 本文將全面解析
Applicaiton類,包括特點(diǎn)、方法介紹、應(yīng)用場(chǎng)景和具體使用,希望你們會(huì)喜歡。
目錄

1. 定義
- 代表應(yīng)用程序(即
Android App)的類,也屬于Android中的一個(gè)系統(tǒng)組件 - 繼承關(guān)系:繼承自
ContextWarpper類

2. 特點(diǎn)
2.1 實(shí)例創(chuàng)建方式:?jiǎn)卫J?/h3>
- 每個(gè)
Android App運(yùn)行時(shí),會(huì)首先自動(dòng)創(chuàng)建Application 類并實(shí)例化 Application 對(duì)象,且只有一個(gè)
即 Application類 是單例模式(singleton)類
- 也可通過(guò) 繼承
Application 類自定義Application 類和實(shí)例
2.2 實(shí)例形式:全局實(shí)例
Android App運(yùn)行時(shí),會(huì)首先自動(dòng)創(chuàng)建Application 類并實(shí)例化 Application 對(duì)象,且只有一個(gè)即 Application類 是單例模式(singleton)類
Application 類自定義Application 類和實(shí)例即不同的組件(如Activity、Service)都可獲得Application對(duì)象且都是同一個(gè)對(duì)象
2.3 生命周期:等于 Android App 的生命周期
Application 對(duì)象的生命周期是整個(gè)程序中最長(zhǎng)的,即等于Android App的生命周期
3. 方法介紹
那么,該 Application 類有什么作用呢?下面,我將介紹Application 類的方法使用

3.1 onCreate()
- 調(diào)用時(shí)刻:
Application實(shí)例創(chuàng)建時(shí)調(diào)用
Android系統(tǒng)的入口是Application類的onCreate(),默認(rèn)為空實(shí)現(xiàn)
- 作用
- 初始化 應(yīng)用程序級(jí)別 的資源,如全局對(duì)象、環(huán)境配置變量、圖片資源初始化、推送服務(wù)的注冊(cè)等
注:請(qǐng)不要執(zhí)行耗時(shí)操作,否則會(huì)拖慢應(yīng)用程序啟動(dòng)速度
- 數(shù)據(jù)共享、數(shù)據(jù)緩存
設(shè)置全局共享數(shù)據(jù),如全局共享變量、方法等
注:這些共享數(shù)據(jù)只在應(yīng)用程序的生命周期內(nèi)有效,當(dāng)該應(yīng)用程序被殺死,這些數(shù)據(jù)也會(huì)被清空,所以只能存儲(chǔ)一些具備 臨時(shí)性的共享數(shù)據(jù)
- 具體使用
// 復(fù)寫方法需要在Application子類里實(shí)現(xiàn)
private static final String VALUE = "Carson";
// 初始化全局變量
@Override
public void onCreate()
{
super.onCreate();
VALUE = 1;
}
}
3.2 registerComponentCallbacks() & unregisterComponentCallbacks()
- 作用:注冊(cè)和注銷
ComponentCallbacks2回調(diào)接口
本質(zhì)上是復(fù)寫
ComponentCallbacks2回調(diào)接口里的方法從而實(shí)現(xiàn)更多的操作,具體下面會(huì)詳細(xì)介紹
- 具體使用
registerComponentCallbacks(new ComponentCallbacks2() {
// 接口里方法下面會(huì)繼續(xù)介紹
@Override
public void onTrimMemory(int level) {
}
@Override
public void onLowMemory() {
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
}
});
3.3 onTrimMemory()
- 作用:通知 應(yīng)用程序 當(dāng)前內(nèi)存使用情況(以內(nèi)存級(jí)別進(jìn)行識(shí)別)
Android 4.0后提供的一個(gè)API

- 應(yīng)用場(chǎng)景:根據(jù)當(dāng)前內(nèi)存使用情況進(jìn)行自身的內(nèi)存資源的不同程度釋放,以避免被系統(tǒng)直接殺掉 & 優(yōu)化應(yīng)用程序的性能體驗(yàn)
- 系統(tǒng)在內(nèi)存不足時(shí)會(huì)按照
LRU Cache中從低到高殺死進(jìn)程;優(yōu)先殺死占用內(nèi)存較高的應(yīng)用- 若應(yīng)用占用內(nèi)存較小 = 被殺死幾率降低,從而快速啟動(dòng)(即熱啟動(dòng) = 啟動(dòng)速度快)
- 可回收的資源包括:
a. 緩存,如文件緩存,圖片緩存
b. 動(dòng)態(tài)生成 & 添加的View
典型的應(yīng)用場(chǎng)景有兩個(gè):

- 具體使用
registerComponentCallbacks(new ComponentCallbacks2() {
@Override
public void onTrimMemory(int level) {
// Android系統(tǒng)會(huì)根據(jù)當(dāng)前內(nèi)存使用的情況,傳入對(duì)應(yīng)的級(jí)別
// 下面以清除緩存為例子介紹
super.onTrimMemory(level);
. if (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE) {
mPendingRequests.clear();
mBitmapHolderCache.evictAll();
mBitmapCache.evictAll();
}
});
- 可回調(diào)對(duì)象 & 對(duì)應(yīng)方法
Application.onTrimMemory()
Activity.onTrimMemory()
Fragment.OnTrimMemory()
Service.onTrimMemory()
ContentProvider.OnTrimMemory()
特別注意:onTrimMemory()中的TRIM_MEMORY_UI_HIDDEN與onStop()的關(guān)系
-
onTrimMemory()中的TRIM_MEMORY_UI_HIDDEN的回調(diào)時(shí)刻:當(dāng)應(yīng)用程序中的所有UI組件全部不可見時(shí) -
Activity的onStop()回調(diào)時(shí)刻:當(dāng)一個(gè)Activity完全不可見的時(shí)候 - 使用建議:
- 在
onStop()中釋放與Activity相關(guān)的資源,如取消網(wǎng)絡(luò)連接或者注銷廣播接收器等 - 在
onTrimMemory()中的TRIM_MEMORY_UI_HIDDEN中釋放與UI相關(guān)的資源,從而保證用戶在使用應(yīng)用程序過(guò)程中,UI相關(guān)的資源不需要重新加載,從而提升響應(yīng)速度
- 在
注:
onTrimMemory的TRIM_MEMORY_UI_HIDDEN等級(jí)是在onStop()方法之前調(diào)用的
3.4 onLowMemory()
- 作用:監(jiān)聽
Android系統(tǒng)整體內(nèi)存較低時(shí)刻 - 調(diào)用時(shí)刻:
Android系統(tǒng)整體內(nèi)存較低時(shí)
registerComponentCallbacks(new ComponentCallbacks2() {
@Override
public void onLowMemory() {
}
});
- 應(yīng)用場(chǎng)景:
Android 4.0前 檢測(cè)內(nèi)存使用情況,從而避免被系統(tǒng)直接殺掉 & 優(yōu)化應(yīng)用程序的性能體驗(yàn)
類似于
OnTrimMemory()
- 特別注意:
OnTrimMemory()&OnLowMemory()關(guān)系-
OnTrimMemory()是OnLowMemory()Android 4.0后的替代API -
OnLowMemory()=OnTrimMemory()中的TRIM_MEMORY_COMPLETE級(jí)別 - 若想兼容
Android 4.0前,請(qǐng)使用OnLowMemory();否則直接使用OnTrimMemory()即可
-
3.5 onConfigurationChanged()
- 作用:監(jiān)聽 應(yīng)用程序 配置信息的改變,如屏幕旋轉(zhuǎn)等
- 調(diào)用時(shí)刻:應(yīng)用程序配置信息 改變時(shí)調(diào)用
- 具體使用
registerComponentCallbacks(new ComponentCallbacks2() {
@Override
public void onConfigurationChanged(Configuration newConfig) {
...
}
});
- 該配置信息是指 :
Manifest.xml文件下的Activity標(biāo)簽屬性android:configChanges的值,如下:
<activity android:name=".MainActivity">
android:configChanges="keyboardHidden|orientation|screenSize"
// 設(shè)置該配置屬性會(huì)使 Activity在配置改變時(shí)不重啟,只執(zhí)行onConfigurationChanged()
// 上述語(yǔ)句表明,設(shè)置該配置屬性可使 Activity 在屏幕旋轉(zhuǎn)時(shí)不重啟
</activity>
3.6 registerActivityLifecycleCallbacks() & unregisterActivityLifecycleCallbacks()
- 作用:注冊(cè) / 注銷對(duì) 應(yīng)用程序內(nèi) 所有
Activity的生命周期監(jiān)聽 - 調(diào)用時(shí)刻:當(dāng)應(yīng)用程序內(nèi)
Activity生命周期發(fā)生變化時(shí)就會(huì)調(diào)用
實(shí)際上是調(diào)用
registerActivityLifecycleCallbacks()里ActivityLifecycleCallbacks接口里的方法
- 具體使用
// 實(shí)際上需要復(fù)寫的是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());
}
});
<-- 測(cè)試:把應(yīng)用程序從前臺(tái)切到后臺(tái)再打開,看Activcity的變化 -->
onActivityPaused: MainActivity
onActivityStopped: MainActivity
onActivityStarted: MainActivity
onActivityResumed: MainActivity
3.7 onTerminate()
調(diào)用時(shí)刻:應(yīng)用程序結(jié)束時(shí)調(diào)用
但該方法只用于
Android仿真機(jī)測(cè)試,在Android產(chǎn)品機(jī)是不會(huì)調(diào)用的
4. 應(yīng)用場(chǎng)景
從Applicaiton類的方法可以看出,Applicaiton類的應(yīng)用場(chǎng)景有:(已按優(yōu)先級(jí)排序)
- 初始化 應(yīng)用程序級(jí)別 的資源,如全局對(duì)象、環(huán)境配置變量等
- 數(shù)據(jù)共享、數(shù)據(jù)緩存,如設(shè)置全局共享變量、方法等
- 獲取應(yīng)用程序當(dāng)前的內(nèi)存使用情況,及時(shí)釋放資源,從而避免被系統(tǒng)殺死
- 監(jiān)聽 應(yīng)用程序 配置信息的改變,如屏幕旋轉(zhuǎn)等
- 監(jiān)聽?wèi)?yīng)用程序內(nèi) 所有Activity的生命周期
5. 具體使用
- 若需要復(fù)寫實(shí)現(xiàn)上述方法,則需要自定義
Application類 - 具體過(guò)程如下
步驟1:新建Application子類
即繼承 Application 類
public class CarsonApplication extends Application
{
...
// 根據(jù)自身需求,并結(jié)合上述介紹的方法進(jìn)行方法復(fù)寫實(shí)現(xiàn)
// 下面以onCreate()為例
private static final String VALUE = "Carson";
// 初始化全局變量
@Override
public void onCreate()
{
super.onCreate();
VALUE = 1;
}
}
步驟2:配置自定義的Application子類
在Manifest.xml文件中 <application>標(biāo)簽里進(jìn)行配置
Manifest.xml
<application
android:name=".CarsonApplication"
// 此處自定義Application子類的名字 = CarsonApplication
</application>
步驟3:使用自定義的Application類實(shí)例
private CarsonApplicaiton app;
// 只需要調(diào)用Activity.getApplication() 或Context.getApplicationContext()就可以獲得一個(gè)Application對(duì)象
app = (CarsonApplication) getApplication();
// 然后再得到相應(yīng)的成員變量 或方法 即可
app.exitApp();
至此,關(guān)于 Applicaiton 類已經(jīng)講解完畢。
6. 總結(jié)
- 我用一張圖總結(jié)上述文章

下面我將繼續(xù)對(duì) Android中的知識(shí)進(jìn)行深入講解 ,感興趣的同學(xué)可以繼續(xù)關(guān)注Carson_Ho的簡(jiǎn)書
相關(guān)系列文章閱讀
Carson帶你學(xué)Android:學(xué)習(xí)方法
Carson帶你學(xué)Android:四大組件
Carson帶你學(xué)Android:自定義View
Carson帶你學(xué)Android:異步-多線程
Carson帶你學(xué)Android:性能優(yōu)化
Carson帶你學(xué)Android:動(dòng)畫
歡迎關(guān)注Carson_Ho的簡(jiǎn)書
不定期分享關(guān)于安卓開發(fā)的干貨,追求短、平、快,但卻不缺深度。
