|
Activity是Android程序的表現(xiàn)層。程序的每一個顯示屏幕就是一個Activity。正在運(yùn)行的Activity處在棧的最頂端,它是運(yùn)行狀態(tài)的。

當(dāng)有新的Activity進(jìn)入屏幕最上端時,原來的Activity就會被壓入第二層。如果他的屏幕沒有被完
全遮蓋,那么他處于Paused狀態(tài),如果他被遮蓋那么處于Stop狀態(tài)。
不管處于任何一層,都可能在系統(tǒng)覺得資源不足時被強(qiáng)行關(guān)閉,當(dāng)然關(guān)閉時棧底的程序最先被關(guān)閉。
譬如:當(dāng)你在程序中調(diào)用 Activity.finish()方法時,結(jié)果和用戶按下 BACK 鍵一樣:他告訴 Activity
Manager該Activity實例可以被“回收”。隨后 Activity Manager 激活處于棧第二層的 Activity 并重
新入棧,把原 Activity 壓入到棧的第二層,從 Running 狀態(tài)轉(zhuǎn)到 Paused
狀態(tài)。
在BlackBerry中,提供了一個管理Screen的棧,用來從任何地方來關(guān)閉位于最上一層的Screen,使用UiApplication.getUiApplication().getActiveScreen()來得到位于最上一層的Screen的實例,并且使用UiApplication.getUiApplication().popScreen()來關(guān)閉一個Screen或關(guān)閉當(dāng)前最上一層的Screen,但是Android卻未提供相應(yīng)的功能,只能在一個Activity的對象里面調(diào)用finish來關(guān)閉自己,不能關(guān)閉其他的Activity。比如我們想實現(xiàn)一個功能從屏幕A—>屏幕B—>屏幕C—>屏幕D,然后在在轉(zhuǎn)到屏幕D之前將屏幕B和C關(guān)閉,在屏幕B和屏幕C界面點(diǎn)擊會退按鈕都可以回退到上一個屏幕,但是在屏幕D上點(diǎn)擊會退按鈕讓其回退到A,此外在一些循環(huán)跳轉(zhuǎn)的界面上如果不在合適的地方將一些不需要的屏幕關(guān)閉,那么經(jīng)過多次跳轉(zhuǎn)后回導(dǎo)致內(nèi)存溢出。對此我們可以設(shè)計一個全局的Activity棧,使用這個棧來管理Activity。管理Activity的類的定義如下:
-
import java.util.Stack;
import android.app.Activity;
public class ScreenManager {
private static
Stack activityStack;
private static ScreenManager instance;
private ScreenManager(){
}
public static ScreenManager
getScreenManager(){
if(instance==null){
instance=new ScreenManager();
}
return instance;
}
public void popActivity(){
Activity
activity=activityStack.lastElement();
if(activity!=null){
activity.finish();
activity=null;
}
}
public void popActivity(Activity
activity){
if(activity!=null){
activity.finish();
activityStack.remove(activity);
activity=null;
}
}
public Activity currentActivity(){
Activity
activity=activityStack.lastElement();
return activity;
}
public void pushActivity(Activity
activity){
if(activityStack==null){
activityStack=new Stack();
}
activityStack.add(activity);
}
public void popAllActivityExceptOne(Class
cls){
while(true){
Activity activity=currentActivity();
if(activity==null){
break;
}
if(activity.getClass().equals(cls) ){
break;
}
|