開發中,我們常會遇到這樣的需求:
從主界面跳轉多個界面完成某項功能,如果這項功能沒有做完,可以隨時回退到上一個界面,如果最後一個節目的子功能也完成了,一次性關閉這些頁面,跳轉回主頁面。
分析:
從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都清理掉,也可以達到同樣的效果。
是不是更簡單呢?