首页 > 代码库 > 打开多个Activity后,任意关闭其中几个、后面几个或者前面几个的解决办法

打开多个Activity后,任意关闭其中几个、后面几个或者前面几个的解决办法

先说一个实际的场景,比如一个购物的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);
	}

}
<span style="font-size:18px;color:#ff0000;">我们在<strong>每个</strong>Activity中,都在onCreate方法中加入如下代码:比如在Activity1.java中的onCreate</span>
<pre name="code" class="java">if (!CacheActivity.activityList.contains(Activity1.this)) {
	CacheActivity.addActivity(<span style="font-family: Arial, Helvetica, sans-serif;">Activity1</span>.this);
}

意味着将他们加入到我们控制池里面去了,然后从付款跳转到登陆,登陆跳到注册,注册跳到充值,都不要finish当前的Activity,这样点击返回就会按照流程返回了。最后我们在充值成功的时候,调用
CacheActivity.finishSingleActivityByClass(Activity2.class);
<pre name="code" class="java" style="font-size:18px;">CacheActivity.finishSingleActivityByClass(Activity3.class)
<pre name="code" class="java" style="font-size:18px;">CacheActivity.finishSingleActivityByClass(Activity4.class)

这样就会关闭后面三个Activity,第一个Activity也就是Activity1就出出来。
<span style="font-size:18px;">我们也可以不把付款的页面加入进去,只把后面三个加入进去,然后调用</span><pre name="code" class="java"><pre name="code" class="java"><span style="font-size:14px;"></span><pre name="code" class="java" style="font-size:18px;">CacheActivity.<span style="font-family: Arial, Helvetica, sans-serif;font-size:14px;">finishActivity(),全部清空,第一个页面也就出来了。</span>
<span style="font-size:18px;">大概思路和做法就是这样。不知道大家听明白没?</span>

打开多个Activity后,任意关闭其中几个、后面几个或者前面几个的解决办法