框架:關閉多個activity的方案之一(用list記錄create過的activity)

步驟一:搞Application類的成員變量作爲list,記錄開過的activity

public class MyApplication extends Application{

 

//運用list來保存們每一個activity是關鍵  

    private List mList = new LinkedList();  

    //爲了實現每次使用該類時不創建新的對象而創建的靜態對象  

   

    // add Activity    

    public void addActivity(Activity activity) {   

        mList.add(activity);   

    }

    public void removeActivity(Activity activity) {   

        mList.remove(activity);   

    } 

    

    //關閉每一個list內的activity  

    public void exit() {   

        try {   

            for (Activity activity:mList) {   

                if (activity != null)   

                    activity.finish();   

            }   

        } catch (Exception e) {   

            e.printStackTrace();   

        } 

//        finally {   

//            System.exit(0);   

//        }   //這個不用也沒關係,不過具體沒經測試人員搞過,不清楚

    }   

    //殺進程  

    public void onLowMemory() {   

        super.onLowMemory();       

        System.gc();   

    }    

 

}

Application使用的細節:

1)網上找的例子,會對Application單例化,以保證list的唯一(丫的我照着單例還報錯了),其實沒必要,Application類是個特別的類,該類下的變量本來就是可以給該應用下的所有activity用作全局變量的;app創建後,系統就會實例化出一個唯一的Application對象,犯不着自己還搞一個單例化模式去搞Application實例。

2)注意在清單裏註冊,補充name屬性

 

步驟二:每個activity的onCreate()裏

加一句:((MyApplication) getApplication()).addActivity(this);

此外,在onDestroy()裏,加一句:((MyApplication) getApplication()).removeActivity(this);

 

下一步,筆者試試寫基類,把這兩行代碼深入activity心

 

步驟三:baseActivity

假如每個activity都要寫上面兩行代碼,那是不科學的

public class BaseActivity extends Activity {

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

((MyApplication) getApplication()).addActivity(this);

 

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

((MyApplication) getApplication()).removeActivity(this);

}

 

}

 

只需要寫上面的baseActivity,然後繼承它就好了

 

關於baseActivity裏的this,下面補充java知識:

要說super就先要說this。
"this",作爲一個特殊的關鍵字,它的規則如下:
1。可以表示構造函數傳遞。this(a,b)表示調用另外一個構造函數。這裏面的this就是一個特殊語法,不是變量,沒有什麼類型。
2。可以在一個類的非static成員內部使用,表示當前這個對象。此時,this就是一個final的普通變量,它有靜態類型,就是這個類C本身;它有動態類型,就是當前這個對象的類型。你可以對它調用成員函數,把它傳遞給別的函數,等等等等。只要一個C類型的final變量可以出現的地方,它就可以出現。

"super"。它和"this"類似,但是也有不同的地方。
1。表示調用父類的構造函數。也是一個特殊語法,不是變量,沒有什麼類型。

2。可以在一個類的非static成員內部使用。比如super.method()。
但是,注意,這個super.method()只是長得跟some_var.method()一樣,一個語法糖而已。實質上,"super"根本不是一個變量。

爲什麼不是?因爲如果是就壞了。java裏面有一個金科玉律:任何public非static函數的調用都是多態的。
所以,如果super是個變量,也指向當前對象,那麼,不管super的靜態類型是什麼super.method()必然調用的是子類的那個版本,而不會是我們期望的,靜態地選擇父類的那個版本。

所以,你只要把super.xxx看成一個特殊的語法,比如理解爲“super::xxx”就好了。

既然super不是一個變量,那麼不能把它象一個普通變量那樣"==",或者傳遞給某個函數就看起來很正常了,是麼?何況,你其實也用不着它,有this你這些要求就都可以辦到了。

3。super的另外一個作用是調用父類的protected函數。只有通過"super"這個魔咒,我們才能操作父類的protected成員,別無它法。

 

總結:this代表的是當前對象,子activity繼承了baseactivity,那麼執行super.oncreate()的那個this就是這個子activity了;要理解這句簡單的話,其實就是要明白,super.xx()裏的這個super絕對不是父類的對象的意思。你就當成一個標誌來理解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章