每次應用程序運行時,應用程序的Application類都保持實例化的狀態。與Activity不同,配置改變並不會導致應用程序重啟。通過擴展Application類,可以完成以下3項工作:
1)對android運行時廣播的應用程序級事件(如低內存)作出響應
2)在應用程序組件之間傳遞對象
3)管理和維護多個應用程序組件使用的資源
其中,后兩項工作通過使用一個單態能夠更能多地完成。當在Manifest中注冊了Application實現以后,它會在創建應用程序進程的時候得到實例化。因此,Application的實現在本質上是單態的,並且應該作為單態進行實現,以便提供對齊方法和成員變量的訪問。
擴展和使用Application類示例:
public class MyApplication extends Application{
private static MyApplication singleton;
/**
*返回應用程序實例
*/
public static MyApplication getInstance(){
return singleton;
}
@Override
public final void onCreate(){
super.onCreate();
singleton = this;
}
}
在創建新的Application類后,必須使用一個name屬性在Manifest的application節點中注冊它,如下面的代碼段所示:
<application android:icon="@drawable/icon"
android:name=".MyApplication">
</application>
當應用程序開始運行的時候,Application實現將會得到實例化。創建新的狀態變量和全局資源,以便從應用程序組件中進行訪問
MyObject value = MyApplication.getInstance().getGlobalStateValue();
MyApplication.getInstance().setGlobalStateValue(myObjectValue);
雖然對於在松散耦合的應用程序組件之間傳遞對象,以及維護應用程序狀態或共享資源,這種方法特別有效,但是一般來說創建自己的靜態單態類而不是為特殊用途擴展Application類是更好的做法,除非你還要處理生命周期事件。
重寫應用程序的生命周期事件
Application類為應用程序的創建和終止、低可用內存和配置改變提供了事件處理程序(如前面部門所述)。
通過重寫以下這些方法,可以為上述幾種情況實現自己的應用程序行為:
1)onCreate 在創建應用程序時調用。可以重寫這個方法來實現實例化應用程序單態,以及創建和實例化任何應用程序狀態變量或共享資源。
2)onLowMemory 當系統處於資源匱乏的狀態時,具有良好行為的應用程序可以釋放額外的內存。這個方法一般只會在后台進程已經終止,但是前台應用程序仍然缺少內存時調用。可以重寫這個處理程序來清空緩存或者釋放不必要的資源。
3)onTrimMemory 作為onLowMemory的一個特定於應用程序的替代選擇,在Android4.0(API level13)中引入。當運行時決定當前應用程序應該嘗試減少其內存開銷時(通常在它進入后台是)調用。它包含一個level參數,用於提供請求的上下文。
4)onConfigurationChanged 與Activity不同,在配置改變時,應用程序對象不會被終止和重啟。如果應用程序使用的值依賴於特定的配置,則重寫這個方法來重新加載這些值,或者在應用程序級別處理配置改變。
public class MyApplication extends Application{ private static MyApplication singleton; /** *返回應用程序實例 */ public static MyApplication getInstance(){ return singleton; } @Override public final void onCreate(){ super.onCreate(); singleton = this; } @Override public final void onLowMemory(){ super.onLowMemory(); } @Override public final void onTrimMemory(int level){ super.onTrimMemory(level); } @Override public final void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig); } }