Activity堆棧管理小技巧

開發中,我們常會遇到這樣的需求:
從主界面跳轉多個界面完成某項功能,如果這項功能沒有做完,可以隨時回退到上一個界面,如果最後一個節目的子功能也完成了,一次性關閉這些頁面,跳轉回主頁面。

分析:
從A界面跳轉到B系列界面完成一項功能。即需要從A界面跳轉到B1界面,完成B1界面的子功能之後,再跳轉到B2界面,完成對應的子功能…,直到跳轉到B5界面,完成B5界面的子功能之後,點擊“完成”按鈕之後,跳轉到A界面並關閉B1、B2、B3、B4、B5這5個界面。若在B1、B2、B3、B4、B5這5個界面中的任意一個界面,都可以返回上一個界面重新編輯。
即正常界面跳轉邏輯是:
A->B1->B2->B3->B4->B5->A

今天在review代碼的時候,發現公司新進來的小夥子用的方法是:新建一個Activity集合


public class ActivityCollector {
    public static LinkedList<Activity> activities = new LinkedList<Activity>();
    public static void addActivity(Activity activity) {
        activities.add(activity);
    }

    public static void removeActivity(Activity activity) {
        activities.remove(activity);
    }

    public static void finishAll() {
        for (Activity activity : activities) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
    }
}

在每一個需要管理的Activity的onCreate方法中,把這個Activity加入該集合

ActivityCollector.addActivity(this);

在onDestory方法中從該集合移除這個Activity

ActivityCollector.removeActivity(this);

在B5界面點“完成”按鈕之後,調用

ActivityCollector.finishAll();

就可以把B系列的界面全部關掉。這樣做邏輯上也可以,但是多維護了一個集合來保存Activity,無疑增加了內存壓力。

其實還有一個更簡單的方法(無需維護集合):
B1到B4Activity不用考慮這個跳轉,到B5Activity點“完成”按鈕之後,跳轉邏輯這樣寫:

 Intent intent = new Intent(B5.this, A.class);   
 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 startActivity(intent);

intent添加了這個flag之後,跳轉到A Activity就會把Activity棧中A界面以上的Activity都清理掉,也可以達到同樣的效果。
是不是更簡單呢?

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