最近在項目中,遇到了application這個類,開始不知道有什麼用,經過學習後才知道它的用途也蠻大的,舉個例子,如果想在整個應用中使用全域變數,在java中一般是使用靜態變數,public類型;而在android中如果使用這樣的全域變數就不符合Android的架構架構,但是可以使用一種更優雅的方式就是使用Application context。
我們先看看一下這段說明:
Base class for those who need to maintain global application state. You
can provide your own implementation by specifying its name in your
AndroidManifest.xml's <application> tag, which will cause that class
to be instantiated for you when the process for your application/package is
created.
意思是:application類是一個基類,這個基類的作用是為了擷取整個應用程式的狀態。你可以自己繼承或實現這個類,當你要使用自己拓展的application類的時候,只要在manifest.xml中的<application>標籤中name應用自己定義的類就行了,這樣做的結果是:當你的應用程式或者包所在的進程建立的時候,這個類就會被執行個體化。
怎麼使用它呢?首先需要重寫Application,主要重寫裡面的onCreate方法,就是建立的時候,初始設定變數的值。然後在整個應用中的各個檔案中就可以對該變數進行操作了。
啟動Application時,系統會建立一個PID,即進程ID,所有的Activity就會在此進程上運行。那麼我們在Application建立的時候初始化全域變數,同一個應用的所有Activity都可以取到這些全域變數的值,換句話說,我們在某一個Activity中改變了這些全域變數的值,那麼在同一個應用的其他Activity中值就會改變。下面舉個例子詳細介紹一下應用步驟:
代碼如下:
[java]
view plaincopy
- yy.android.yapp;
- import android.app.Application;
-
- public class YApp extends Application{
-
- private String ylabel ;
- public String getLabel(){
- return ylabel;
- }
- public void setLabel(String s){
- this.ylabel = s;
- }
-
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- super.onCreate();
- setLabel("YUZHIBOYI_CSND!"); //初始化全域變數
- }
- }
下面是mainActivity.java
[java]
view plaincopy
- package yy.android.yapp;
-
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.util.Log;
-
- public class mainActivity extends Activity {
-
- private YApp yApp;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- yApp = (YApp) getApplication(); //獲得自訂的應用程式YApp
- Log.i("YAnGl", "InitLabel:"+yApp.getLabel()); //將我們放到進程中的全域變數拿出來,看是不是我們曾經設定的值
-
- yApp.setLabel("YUZHIBOYI!"); //修改一下
- Log.i("YAnG", "ChangeLabel:"+yApp.getLabel()); //看下,這個值改變了沒有
-
- Intent intent = new Intent(); //再看一下在另一個Activity中是取到初始化的值,還是取到修改後的值
- intent.setClass(this, otherActivity.class);
- startActivity(intent);
- }
- }
另一個otherActivity.java:
[java]
view plaincopy
- package yy.android.yapp;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
-
- public class otherActivity extends Activity{
-
- private YApp yApp;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
-
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- yApp = (YApp) getApplication(); //獲得自訂的應用程式MyApp
- Log.i("YAnG", "OhterActivity receive the Label:"+yApp.getLabel()); //查看變數值是否修改了
-
- }
- }
修改設定檔ApplicationManifest.xml,將要啟動並執行應用程式YApp加進去:
[html]
view plaincopy
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.test"
- android:versionCode="1"
- android:versionName="1.0">
- <!-- 在這裡,將預設的Application設定成自己做的YApp-->
- <application android:name="YApp"
- android:icon="@drawable/icon"
- android:label="@string/app_name"
- >
- <activity android:name=".mainActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name=".otherActivity">
- </activity>
- </application>
-
- </manifest>
啟動並執行結果:
03-04 16:53:17.295: INFO/guoll(650): InitLabel:YUZHIBOYI_CSND!
03-04 16:53:17.295: INFO/guoll(650): ChangeLabel:YUZHIBOYI
03-04 16:53:17.426: INFO/guoll(650): OhterActivity receive the Label:YUZHIBOYI
好了,用法就這樣!