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

本文介绍了一种使用缓存池管理安卓应用多个Activity的方法,确保用户能够按预期流程返回上一页面,同时支持一键清除所有非目标Activity。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


全部清空,第一个页面也就出来了。;
 
大概思路和做法就是这样。不知道大家听明白没?


### 数据共享的方法 对于同一开发者的多个应用程序之间的数据共享,具体实现方式取决于操作系统和平台的不同特性。以下是几种常见的方式: #### Android 平台上的数据共享 在Android平台上,可以通过Shared User ID来实现在不同APK间的资源共享[^1]。当两个或更多个应用被赋予相同的sharedUserId属性时,它们会被视为具有相同的身份认证级别,并能够运行在同一进程中,默认情况下可以互相访问任意数据。 如果希望保持独立进程但仍需访问对方的数据,则可以在`<application>`标签内设置相应的权限以及路径指向其他应用的数据存储位置。这样即使处于分离状态下也能像操作本地文件那样读取另一个APP内的数据库或其他形式的信息。 ```xml <!-- 定义 sharedUserId --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app1" android:sharedUserId="com.example.shared"> </manifest> ``` 此外,在某些场景下还可以利用ContentProvider组件提供跨应用层面上更安全可控的内容交换接口;或者借助于Intent机制传递临时性的简单数据集给目标Activity处理。 #### 微信小程序环境下的数据共享 针对微信小程序而言,官方提供了云开发功能支持多款小程序共用一套云端服务实例[^3]。这意味着只要经过适当授权之后,任何关联的小程序都能够无缝接入到指定环境中并获取其中保存的各项资料记录——无论是文档、图片还是关系型表格等等皆可通用无阻。 为了使另一方能顺利连入既定空间内部,通常需要先完成初次创建者那边的相关设定工作(比如开放特定集合供外部调阅),随后再指导后续加入者按照指引调整各自项目的配置参数直至成功建立连接为止。 #### HarmonyOS 应用间的数据共享 而在HarmonyOS环境下,由于其独特的分布式架构设计使得同属一位作者旗下的各类软件产品天然具备良好的互通性基础[^4]。开发者只需确保各子模块(.hap)所属的应用包名(bundleName)统一即可轻松达成预期效果。当然实际编码过程中可能还会涉及到一些额外的安全策略考量因素,例如定义合理的权限声明以保护敏感信息免受非法篡改侵害等问题。 ### 实现要点总结 - **身份验证一致性**:确保所有涉及的应用都采用一致的身份标识符。 - **权限管理严格化**:合理分配必要的存取许可范围,防止越权行为发生。 - **通信协议标准化**:选用成熟可靠的传输标准作为中介桥梁促进双方交流互动顺畅高效。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值