標籤:
每次運行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 @Override14 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 @Override14 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 @Override14 public final void onLowMemory() {15 super.onLowMemory();16 }17 18 @Override19 public void onTrimMemory(int level) {20 //此方法在Android 4.0(API level 13)中引入,使用時請注意。21 super.onTrimMemory(level);22 }23 24 @Override25 public void onConfigurationChanged(Configuration newConfig) {26 super.onConfigurationChanged(newConfig);27 }28 }
Android進階編程筆記(三)Application類簡介