先說一個實際的場景,比如一個購物的App。用戶進來先去浏覽商品,選好了。打算付款,這個時候停留在Activity1.java。這個時候提示沒有登錄,就會跳轉到登錄頁面Activity2.java。用戶發現自己還沒有賬號。點擊登錄旁邊的注冊按鈕就跳轉到Activity3.java。注冊之後,再登錄,登錄之後發現沒錢,就跳轉到充值界面Activity4.java。最後充值成功,關閉之前所有界面只留下付款頁面,也就是Activity1.java。
在這個過程中。用戶隨時可以點擊返回,也要一步一步返回回去,比如在注冊的時候不想注冊,點擊返回還要退到登錄界面。所以你還不能在跳到注冊的是把登錄的Activity finish掉。
這一系列的流程跳轉怎麼來處理了。開始我也頭痛,後來想到一個辦法。
思路如下:我們可以定義一個緩存池,把之前所有打開的Activity頁面作為對象都放進去,到最後清空一下這個緩存就行了。
代碼如下:
public class CacheActivity { public static List activityList = new LinkedList(); public CacheActivity() { } /** * 添加到Activity容器中 */ public static void addActivity(Activity activity) { if (!activityList.contains(activity)) { activityList.add(activity); } } /** * 便利所有Activigty並finish */ public static void finishActivity() { for (Activity activity : activityList) { activity.finish(); } } /** * 結束指定的Activity */ public static void finishSingleActivity(Activity activity) { if (activity != null) { if (activityList.contains(activity)) { activityList.remove(activity); } activity.finish(); activity = null; } } /** * 結束指定類名的Activity 在遍歷一個列表的時候不能執行刪除操作,所有我們先記住要刪除的對象,遍歷之後才去刪除。 */ public static void finishSingleActivityByClass(Class> cls) { Activity tempActivity = null; for (Activity activity : activityList) { if (activity.getClass().equals(cls)) { tempActivity = activity; } } finishSingleActivity(tempActivity); } }
我們在每個Activity中,都在onCreate方法中加入如下代碼:比如在Activity1.java中的onCreate
if (!CacheActivity.activityList.contains(Activity1.this)) {
CacheActivity.addActivity(Activity1.this);
}
意味著將他們加入到我們控制池裡面去了,然後從付款跳轉到登陸,登陸跳到注冊,注冊跳到充值,都不要finish當前的Activity,這樣點擊返回就會按照流程返回了。最後我們在充值成功的時候,調用
CacheActivity.finishSingleActivityByClass(Activity2.class);
CacheActivity.finishSingleActivityByClass(Activity3.class);
CacheActivity.finishSingleActivityByClass(Activity4.class);
這樣就會關閉後面三個Activity,第一個Activity也就是Activity1就出出來。
我們也可以不把付款的頁面加入進去,只把後面三個加入進去,然後調用
CacheActivity.finishActivity();
全部清空,第一個頁面也就出來了。;
大概思路和做法就是這樣。不知道大家聽明白沒?