每次運行APP時,Application類都保持實例化狀態。與Activity不同,配置改變不會導致應用程序重啟。通過繼承Application類,可以完成一下3項工作:
· 對Android運行時廣播的應用程序級事件做出相應。
· 在應用程序組件之間傳遞對象。
· 管理和維護多個應用程序組件使用的資源。
其中,后兩項工作通過使用一個單態類能夠更好地完成。Application的實現在本質上是單態的,並應作為單態實現,以便提供對其方法和成員變量的訪問。
一、擴展和使用Application類
如下程序是擴展了Application類的框架代碼,並把它實現為一個單態。
1 public class MyApplication extends Application { 2 private static MyApplication singleton; 3 4 public static MyApplication getInstance(){ 5 return singleton; 6 } 7 8 @Override 9 public final void onCreate() { 10 super.onCreate(); 11 singleton = this; 12 } 13 }
需要注意的是,在創建新的Application類后,需要在Manifest的application節點中注冊它,如下所示:
1 <application 2 android:allowBackup="true" 3 android:name=".MyApplication" 4 android:icon="@drawable/ic_launcher" 5 android:label="@string/app_name" 6 android:theme="@style/AppTheme" > 7 <activity 8 android:name=".MainActivity" 9 android:label="@string/app_name" > 10 <intent-filter> 11 <action android:name="android.intent.action.MAIN" /> 12 13 <category android:name="android.intent.category.LAUNCHER" /> 14 </intent-filter> 15 </activity> 16 </application>
當應用程序開始運行時,Application實現將會得到實例化。創建新的狀態變量和全局資源,在程序中我們可以通過以下方式使用它:
1 MyApplication myApp = MyApplication.getInstance();//獲取Application類實例化對象 2 myApp.setTest("測試數據");//更改狀態變量 3 String test = myApp.getTest();//獲取狀態變量
我們知道,在Activity傳遞變量的方式有很多種,(如:Intent傳參),但就像有些常用的狀態變量(如:用戶的userId),如果每次得通過Intent方式傳來傳去的話,很容易導致邏輯混亂,那么這時候我們就可以將這個常用的公共變量保存到Application類中,無論哪一個Activity需要用到它時,直接從Application類中獲取即可,非常方便。下面以一個簡單的例子來說明一下通過Application類達到共享變量的效果:
示例說明:創建兩個Activity,用其中的一個Activity改變Application中的變量,然后在另一個Activity中驗證此變量的改變。(例子很簡單,能說明問題即可)先看一下效果圖:

1、首先創建MyApplication去繼承Application類
1 public class MyApplication extends Application { 2 private static MyApplication singleton; 3 private String test; 4 public static MyApplication getInstance(){ 5 return singleton; 6 } 7 public String getTest() { 8 return test; 9 } 10 public void setTest(String test) { 11 this.test = test; 12 } 13 @Override 14 public final void onCreate() { 15 super.onCreate(); 16 singleton = this; 17 } 18 }
以上代碼,在MyApplication類中,包含了一個MyApplication的實例變量和一個測試變量。
2、在MainActivity中獲取MyApplication的實例化對象,並且改變MyApplication中test變量的值。
1 public class MainActivity extends Activity { 2 private MyApplication myApp; 3 EditText etTest; 4 Button bnGo; 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 myApp = MyApplication.getInstance();//獲取Application類實例化對象 10 etTest = (EditText)findViewById(R.id.et_test);//綁定控件 11 bnGo = (Button)findViewById(R.id.bn_go);//綁定控件 12 bnGo.setOnClickListener(new OnClickListener() { 13 @Override 14 public void onClick(View arg0) { 15 myApp.setTest(etTest.getText().toString());//改變MyApplication中test變量的值 16 Intent intent = new Intent(MainActivity.this, TestActivity.class); 17 startActivity(intent); 18 } 19 }); 20 } 21 }
3、在TestActivity取出MyApplication中的test值並顯示在TextView上。
1 public class TestActivity extends Activity { 2 private String test; 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_test); 7 TextView tvShow = (TextView)findViewById(R.id.tv_show); 8 test = MyApplication.getInstance().getTest(); 9 tvShow.setText(test); 10 } 11 }
二、重寫應用程序的生命周期事件
Application類為應用程序的創建和終止,低可用內存和配置改變提供了事件處理程序。
通過重寫一下方法,可以為上述幾種情況實現自己的應用程序行為:
· onCreate 創建應用程序時調用。可通過重寫此方法來實例化應用程序的單態,以及創建和實例化任何應用程序的狀態變量和共享資源。
· onLowMemory: 當系統處於資源匱乏狀態是,具有良好行為的應用程序可以釋放額外的內存。此方法一般只會在后台進程已經終止,但是前台應用程序仍然缺少內存是調用。可通過重寫此方法來清空緩存或者釋放不必要的資源。
· onTrimMemory:作為onLowMemory的一個特定於應用程序的替代選擇,在Android 4.0(API level 13)中引入。
· onConfigurationChanged:在配置改變時,應用程序對象不會被終止和重啟。如果應用程序使用到的值需要在配置改變時重新加載,則可以通過重寫此方法實現。
以下是重寫什么周期事件的代碼(沒有實現具體功能):
1 public class MyApplication extends Application { 2 private static MyApplication singleton; 3 public static MyApplication getInstance(){ 4 return singleton; 5 } 6 7 @Override 8 public final void onCreate() { 9 super.onCreate(); 10 singleton = this; 11 } 12 13 @Override 14 public final void onLowMemory() { 15 super.onLowMemory(); 16 } 17 18 @Override 19 public void onTrimMemory(int level) { 20 //此方法在Android 4.0(API level 13)中引入,使用時請注意。 21 super.onTrimMemory(level); 22 } 23 24 @Override 25 public void onConfigurationChanged(Configuration newConfig) { 26 super.onConfigurationChanged(newConfig); 27 } 28 }
