讀古今文學網 > Android程序設計:第2版 > Application類的生命週期方法 >

Application類的生命週期方法

在簡單的應用中很少使用Application類的生命週期方法,即使在複雜的應用中也不應濫用。濫用Application類很容易覆蓋多個活動之間的內存數據。這違背了Android的基於組件管理資源的設計初衷。例如,打算把Activity對象的數據引用變成Application對象的數據引用,採用的實現方式是擴展了系統在低內存情況下在應用的生命週期內獲取資源的方式,這個時候,將需要在整個活動的生命週期中一直獨立管理這些資源。

這裡,我們實現了Application類的生命週期方法,以說明其在Android應用生命週期中的作用。另外,這些方法中的日誌信息可能是有用的:


package com.finchframework.finch;
import android.app.Application;
import android.content.res.Configuration;
import android.util.Log;
/**
 * @author zigurd
 *
 *             This the framework's Application subclass. This illustrates what
 *             you may need to do in an Application subclass.
 *
 *             To get this class instantiated, you must refer to it in the
 *             application tag of the manifest.
 */
public class FinchApplication extends Application {
    private final String TAG = this.getClass.getSimpleName;
    @Override
    public void onCreate {
        // First, call the parent class
        super.onCreate;
        // This is a good place to put code that must manage global data across
        // multiple activities, but it's better to keep most things in a
        // database, rather than in memory
        Log.i(TAG, "onCreate");
    }
    @Override
    public void onTerminate {
        Log.i(TAG, "onTerminate");
    }
    @Override
    public void onLowMemory {
        // In-memory caches should be thrown overboard here
        Log.i(TAG, "onLowMemory");
    }
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        Log.i(TAG, "onConfigurationChanged");
        if (Log.isLoggable(TAG, Log.VERBOSE)) {
            Log.v(TAG, newConfig.toString);
        }
    }
}
  

在前面我們提到過,很多應用不需要繼承Application類。因此,New Android Project Wizard不會創建Application子類,也不會在manifest文件中增加對Application類的引用。正如當交互應用啟動時會啟動初始對像那樣,作為應用啟動的一部分,Android系統會實例化你所創建的Application子類。和Android處理Activity子類的方式類似,它知道要對哪個類執行實例化,它會讀取manifest文件中的application標籤的android:name屬性。確保實例化正確的最簡單的處理方式是使用manifest編輯器編輯Application標籤。Application標籤的第一個字段是Name(如圖10-7所示)。單擊該字段旁邊的瀏覽(Browse)按鈕會顯示應用的Application子類。

圖10-7:使用manifest編輯器編輯Application標籤的Name字段,在這個輸入框中輸入所定義的Application子類的名字

談到Activity類的生命週期方法時,瞭解這些方法何時被調用是最重要的。當然,可以通過調試的方式來查看,在每個方法中設置一個斷點。但是通常情況下,最翔實的信息通常融合在長時間運行的應用程序的行為中,通過Activity類和Application類的子類所使用的標籤對日誌進行過濾,可以清晰地瞭解生命週期方法到底是何時被調用的。

在Application類中最有趣的兩個回調是onLowMemory方法和onTerminate方法,顧名思義,它們的任務是告訴你何時系統認為內存很低,以及何時應用結束。第二個情況不是很常見,因為大部分Android應用不需要顯式退出。Android的內存管理和組件生命週期密切相關,只要正確地實現了生命週期和內存管理,它就有能力清除沒用的代碼。