如何讓很多activity共用一個物件 Application類別

在 如何讓很多activity共用一個物件 獨體模式(Singleton Pattern) 當中, 我們談到怎麼讓很多個Activity共同存取同一個物件, 其實還有另外一個方法, 那就是利用Application。

其實, Android最初起始的類別就是Application類別, 從AndroidManifest.xml就可以看出端倪。


我們先宣告一個Person的類別, 這個用來讓Application存取, 以便達到物件共用的目的。
public class Person {
    private String name;
    private int age;
    public Person(){
        name = "baby";
        age = 0;
    }
    public void setName(String name){
        this.name = name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
}
由這個類別可以看到我們可以設定名字跟年紀, 如果沒有設定就是baby, 0歲。

然後我們建立一個Application的子類別。
public class MyApp extends Application {
    private Person p;
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        p = new Person();
    }
    public Person getPerson(){
        return p;
    }
}
在這個類別宣告一個Person物件, 並且初始化它, 接著建立一個方法可以取得它。

並且在AndroidManifest.xml內設定為Application。
<application
        android:name="com.example.applicationdemo.MyApp"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >


接著分別建立兩個類別, 一個是MainActivity類別, 另外一個是NextActivity,
首先由MainActivity類別來設定Person物件, 然後由NextActivity來讀取, 看是否值相同,
如果值相同就代表取到相同物件。

MainActivity設定好姓名跟年紀以後, 轉跳到NextActivity類別。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyApp m = (MyApp)getApplication();
        Person myPerson = m.getPerson();
        myPerson.setName("givemepass");
        myPerson.setAge(18);
        startActivity(new Intent().setClass(MainActivity.this, NextActivity.class));
    }


NextActivity將物件取出來, 並且讀取姓名跟類別。
@Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        MyApp m = (MyApp)getApplication();
        Person p = m.getPerson();
        Log.e("NextActivity givemepass",p.getName());
        Log.e("NextActivity givemepass",Integer.toString(p.getAge()));
    }

看到結果真的是同一個物件。



這次的範例雖然是利用Application類別幫忙傳遞物件, 但是其實並不推薦這種方式, 只是提供一種做法而已, 參考看看。


程式碼
http://uploadingit.com/file/qeo0odq0xipfgu7g/ApplicationDemo.zip