Carson帶你學(xué)Android:全面解析 熟悉而陌生 的Application類使用


前言

  • 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í)例

即不同的組件(如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)

  • 作用
    1. 初始化 應(yīng)用程序級(jí)別 的資源,如全局對(duì)象、環(huán)境配置變量、圖片資源初始化、推送服務(wù)的注冊(cè)等

注:請(qǐng)不要執(zhí)行耗時(shí)操作,否則會(huì)拖慢應(yīng)用程序啟動(dòng)速度

  1. 數(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)
  1. 系統(tǒng)在內(nèi)存不足時(shí)會(huì)按照LRU Cache中從低到高殺死進(jìn)程;優(yōu)先殺死占用內(nèi)存較高的應(yīng)用
  2. 若應(yīng)用占用內(nèi)存較小 = 被殺死幾率降低,從而快速啟動(dòng)(即熱啟動(dòng) = 啟動(dòng)速度快)
  3. 可回收的資源包括:
    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_HIDDENonStop()的關(guān)系

  • onTrimMemory()中的TRIM_MEMORY_UI_HIDDEN的回調(diào)時(shí)刻:當(dāng)應(yīng)用程序中的所有UI組件全部不可見時(shí)
  • ActivityonStop()回調(diào)時(shí)刻:當(dāng)一個(gè)Activity完全不可見的時(shí)候
  • 使用建議:
    1. onStop()中釋放與 Activity相關(guān)的資源,如取消網(wǎng)絡(luò)連接或者注銷廣播接收器等
    2. onTrimMemory()中的TRIM_MEMORY_UI_HIDDEN中釋放與UI相關(guān)的資源,從而保證用戶在使用應(yīng)用程序過(guò)程中,UI相關(guān)的資源不需要重新加載,從而提升響應(yīng)速度

注:onTrimMemoryTRIM_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)系
    1. OnTrimMemory()OnLowMemory() Android 4.0后的替代 API
    2. OnLowMemory() = OnTrimMemory()中的TRIM_MEMORY_COMPLETE級(jí)別
    3. 若想兼容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ā)的干貨,追求短、平、快,但卻不缺深度。


請(qǐng)點(diǎn)贊!因?yàn)槟愕墓膭?lì)是我寫作的最大動(dòng)力!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容