アプリを継承してグローバルリソース共有を実現します.

6212 ワード

原文の住所:http://www.cnblogs.com/Dentist/p/Mr_Dentist_.html
各プログラムが実行されている時に、一つのアプリクラスのオブジェクトが作成されます.一つだけです.アプリが終わるとこのアプリは消えます.だから、Applicationを利用してデータの処理と保存ができます.複数のactivityまたはfragment間でデータを交換します.例えば、一つのアプリの設定、テーマ、ユーザ情報などです.これを使ってグローバル変数はstaticよりもデータの集中管理に便利です.
たとえば:
public class MyApp extends Application {
    private Person person;
    private String corpsname;
    private List<Person> corpsmember;
    
    public void setPerson(Person person){
        this.person=person;
    }
    public Person getPerson(){
        return person;
    }
    public void setCorps(String corps){
        this.corpsname=corps;
    }
    public String getCorps(){
        return corpsname;
    }
    public List<Person> getcorpsmember(){
        return corpsmember;
    }
    public void setcorpsmember(List<Person> corpsmember){
        this.corpsmember=corpsmember;
    }
}
一つのクラスを建ててからAppleクラスを継承します.Android Manifest.xmlファイルでandroidを変更します.name属性は、所在するパケット名+クラス名です.
    <application
        android:name="com.example.MyApp.MyApp"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
そして、様々な場所でMyAppとデータを交換することができます.
        MyApp mapp=(MyApp)getApplication();
        String corps=mapp.getCorps();   
 
普段の使用は一つのActivityで最初からApplicationを取得します.Activity全体で使用できます.とても便利です
    public MyApp mapp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.person);
        mapp=(MyApp)getApplication();
        
    }
 
他のクラスでは、例えばadapperでApplicationを取得するには、次のようなものが必要です.
MyApp myapp=(MyApp)context.getApplicationContext();
 
ただし、Activityへの参照を持っているオブジェクトを持ち込まないように注意してください.このactivityは終了後もGCに回収されず、メモリが漏れてしまいます.
 
アプリ類に対しては用途が広いです.以下の例では、activityが多い場合、activity管理の便利さを示しています.
public class MreApplication extends Application {
    public static final String TAG="Mre";

    /**    activity        ,  activity                   ,KEY   activity  **/
    private HashMap<String, HashMap<String, Object>> activityState;

    /**  activity  ,    activity  **/
    private Stack<String> activityStack;

    public HashMap<String, HashMap<String, Object>> getActivityState() {
        return activityState;
    }

    public void setActivityState(HashMap<String, HashMap<String, Object>> activityState) {
        this.activityState = activityState;
    }

    public Stack<String> getActivityStack() {
        return activityStack;
    }

    public void setActivityStack(Stack<String> activityStack) {
        this.activityStack = activityStack;
    }

    /**
     *         activity
     */
    public void popActivity() {
        String activity = activityStack.lastElement();
        if (activity != null) {
            activityStack.remove(activity);
            activity = null;
        }
    }

    /**
     *       activity
     */
    public void popActivity(String activity) {
        if (activity != null) {
            activityStack.remove(activity);
            activity = null;
        }
    }

    /**
     *    activity
     */
    public String currentActivity() {
        if (activityStack == null) {
            return null;
        }
        String activity = activityStack.lastElement();
        return activity;
    }

    /**
     *   activity
     */
    public void pushActivity(String activity) {
        if (activityStack == null) {
            activityStack = new Stack<String>();
        }
        activityStack.add(activity);
    }
}