先说一个实际的场景,比如一个购物的App。用户进来先去浏览商品,选好了。打算付款,这个时候停留在Activity1.java。这个时候提示没有登录,就会跳转到登录页面Activity2.java。用户发现自己还没有账号。点击登录旁边的注册按钮就跳转到Activity3.java。注册之后,再登录,登录之后发现没钱,就跳转到充值界面Activity4.java。最后充值成功,关闭之前所有界面只留下付款页面,也就是Activity1.java。
在这个过程中。用户随时可以点击返回,也要一步一步返回回去,比如在注册的时候不想注册,点击返回还要退到登录界面。所以你还不能在跳到注册的是把登录的Activity finish掉。
这一系列的流程跳转怎么来处理了。开始我也头痛,后来想到一个办法。
思路如下:我们可以定义一个缓存池,把之前所有打开的Activity页面作为对象都放进去,到最后清空一下这个缓存就行了。
代码如下:
public class CacheActivity { public static List<Activity> activityList = new LinkedList<Activity>(); 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();
全部清空,第一个页面也就出来了。;
大概思路和做法就是这样。不知道大家听明白没?