步驟一:搞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絕對不是父類的對象的意思。你就當成一個標誌來理解