Android:全面解析 熟悉而陌生 的Application類使用

來源:互聯網
上載者:User

標籤:儲存   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(),預設為空白實現

  • 作用
    1. 初始化 應用程式層級 的資源,如全域對象、環境組態變數、圖片資源初始化、推送服務的註冊等

註:請不要執行耗時操作,否則會拖慢應用程式啟動速度

  1. 資料共用、資料緩衝
    設定全域共用資料,如全域共用變數、方法等

註:這些共用資料只在應用程式的生命週期內有效,當該應用程式被殺死,這些資料也會被清空,所以只能儲存一些具備 臨時性的共用資料

  • 具體使用
// 複寫方法需要在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

  • 應用情境:根據當前記憶體使用量情況進行自身的記憶體資源的不同程度釋放,以避免被系統直接殺掉 & 最佳化應用程式的效能體驗
  1. 系統在記憶體不足時會按照LRU Cache中從低到高殺死進程;優先殺死佔用記憶體較高的應用
  2. 若應用佔用記憶體較小 = 被殺死幾率降低,從而快速啟動(即暖開機 = 啟動速度快)
  3. 可回收的資源套件括:
    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_HIDDENonStop()的關係

  • onTrimMemory()中的TRIM_MEMORY_UI_HIDDEN的回調時刻:當應用程式中的所有UI組件全部不可見時
  • ActivityonStop()回調時刻:當一個Activity完全不可見的時候
  • 使用建議:
    1. onStop()中釋放與 Activity相關的資源,如取消網路連接或者登出廣播接收器等
    2. onTrimMemory()中的TRIM_MEMORY_UI_HIDDEN中釋放與UI相關的資源,從而保證使用者在使用應用程式過程中,UI相關的資源不需要重新載入,從而提升響應速度

註:onTrimMemoryTRIM_MEMORY_UI_HIDDEN等級是在onStop()方法之前調用

3.4 onLowMemory()
  • 作用:監聽 Android系統整體記憶體較低時刻
  • 調用時刻:Android系統整體記憶體較低時
registerComponentCallbacks(new ComponentCallbacks2() {  @Override            public void onLowMemory() {            }        });
  • 應用情境:Android 4.0前 檢測記憶體使用量情況,從而避免被系統直接殺掉 & 最佳化應用程式的效能體驗

類似於 OnTrimMemory()

  • 特別注意:OnTrimMemory() & OnLowMemory() 關係
    1. OnTrimMemory()OnLowMemory() Android 4.0後的替代 API
    2. OnLowMemory() = OnTrimMemory()中的TRIM_MEMORY_COMPLETE層級
    3. 若想相容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類使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.