打开多个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>
时间: 2024-07-28 20:06:13

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

Virtual:VirtualBox 安装Centos7后 安装增强功能出现kernel headers not found for target kernel 错误的解决办法

VirtualBox 安装Centos7后 安装增强功能出现kernel headers not found for target kernel 错误的解决办法 提示:kernel headers not found for target kernel 原因已经表明出来了,说明kernel headers 没有安装; 直接贴出解决方案: 1.update kernel yum update kernel -y 2.Install the kernel-headers, kernel-devel 

Android打开新的Activity并同时关闭当前Activity

Intent it = new Intent(); it.setClass(EditActivity.this, MainActivity.class); it.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(it); 重点是调用.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 如果执行完当前Activity后无需跳转到其他指定的活动界面,则可以直接在执行完成后调用 EditActivity.thi

Excel无法打开文件xxx.xlsx,因为文件格式或文件扩展名无效。请确定文件未损坏解决办法

问题 右键新建Microsoft Excel工作表,双机点开表格提示以下内容: 桌面新建excel表格后,打开时,提示"Excel无法打开文件xxx.xlsx,因为文件格式或文件扩展名无效.请确定文件未损坏,并且文件扩展名与文件的格式匹配" . 为此我在百度上搜了很此办法的帖子,最终经过半天的时间还是被我给解决了. 解决方法如下: 1.首先找一个能打开的Excel表 把里面的内容删除完毕另存到C:\Program Files\Microsoft Office\下重新命名01.xlsx,

将window的shell脚本通过ftp传输到Linux服务器后, shell脚本中执行时提示“没有那个文件或目录”的解决办法

出现bad interpreter:No such file or directory的原因,是文件格式的问题.这个文件是在Windows下编写的.换行的方式与Unix不一样,但是在vim下面如果不Set一下又完全看不出来. 问题分析:1.将windows 下编写好的SHELL文件,传到linux下执行,提示出错.2.出错信息:bad interpreter: 没有那个文件或目录. 问题原因:因为操作系统是windows,在windows下编辑的脚本,所以有可能有不可见字符.脚本文件是DOS格式

SnagIt截图后无法在编辑器打开,不显示截图内容的解决办法

方法1: 用SnagIt截图后,弹出的编辑器里不显示刚才截图的内容,解决办法如下: 完全退出Snagit和编辑器,删除以下文件夹下的所有文件和文件夹: Win7用户 C:\Users\Your Username\AppData\Local\TechSmith\SnagIt XP用户  C:\Documents and Settings\Your Username\Local Settings\Application Data\TechSmith\SnagIt (注意:关闭文件夹隐藏选项,不然又可

hadoop启动后jps查不到namenode的解决办法

最近由于项目需要开始接触hadoop,在配置伪分布式启动后,jps查询进程发现少了namenode,而DataNode却存在. 下面是我的core-site.xml和hdfs-site.xml配置: core-site.xml <configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <desc

打开word2010每次都要配置进度的解决办法

作者:朱金灿 来源:http://blog.csdn.net/clever101 不小心把ms office2010搞坏了,于是重装ms office2010,结果一打开word文档时总是出现下面的对话框: 一开始网上搜到一种解决办法是:重命名C:\Program Files\Common Files\Microsoft Shared\OFFICE14\Office SetupController目录中的"Setup.exe"文件名.实际上这种办法不能解决问题.正确的做法是命令行里运行

excel 如何 筛选,以及筛选后,在复制时 显示 不可对多重选定区域使用此命令的解决办法

excel 如何 筛选,以及筛选后,在复制时 显示 不可对多重选定区域使用此命令的解决办法选中 第一行, 开始 筛选 选择 某一列 右下角的小三角 ,进行内容筛选 即可. excel 筛选后,在复制时 显示 不可对多重选定区域使用此命令解决办法筛选结束后,选择几列进行复制会提示"不可对多重选定区域使用此命令".那么就别单独选择几列了,而是全选.点击整个表格的左上角,这样筛选 后的结果就会都被选中.右击 "复制",然后 粘贴 到 sheet2工作表中.这样就把筛选的结

Android开发中使用startActivityForResult()方法从Activity A跳转Activity B出现B退出时A也同时退出的解决办法

最近一个 App 中用到了 startActivityForResult() 方法,使用的时候却出现了一些问题,比如我在 Activity A 中调用该方法向 Activity B 中跳转,如果 B 中完成一系列操作之后用 setResult(resultcode, intent); finish(); 跳转到 A ,A 在 onActivityResult() 中进行处理没什么问题,但是如果,用户取消了操作,比如在B中按下返回键,这样就会造成一个情况,就是当 Activity B 结束,Act