Android 基于清单文件mate-data数据共享

首先是数据提供方:

在 AndroidManifest.xml 中进行注册

XML 复制代码
<application>

 <!--这里直接注册在 application中,也可以注册在 activity or service中-->
 <meta-data
            android:name="ins.attr.xxx"
            android:exported="true"
            android:resource="@xml/shared_data" />

</application>

在 res/xml 里面定义文件 shared_data

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<map>
<string name="aaaaa">xxxx</string>
<string name="bbbbb">xxx1</string>
<string name="ccccc">xxx2</string>
<string name="ddddd">xxx3</string>
</map>

数据接入方:

这里对结果只解析了最常见的 Map<String, String> 其他场景可以具体适配

java 复制代码
		// 目标应用的包名
		String targetPackage = "com.xx.xx.xx";
		Map<String, String> resultMap = new HashMap<>();
		try {
			// 获取PackageManager
			PackageManager pm = getPackageManager();
			// 获取定义数据应用的ApplicationInfo (需要知道其包名)
			ApplicationInfo ai = pm.getApplicationInfo(targetPackage, PackageManager.GET_META_DATA);
			Bundle metaData = ai.metaData;
			if (metaData != null) {
				// 获取资源ID,使用你在meta-data中设置的name
				int sharedDataResId = metaData.getInt("ins.attr.xxx");

				// 现在你有了资源ID sharedDataResId,下一步是获取其代表的内容
				if (sharedDataResId != 0) {
					// 访问实际资源
					Context targetContext = createPackageContext(targetPackage, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);

					// 5. 获取XML解析器
					Resources targetResources = targetContext.getResources();
					XmlResourceParser parser = targetResources.getXml(sharedDataResId);

					// 6. 解析XML内容
					resultMap = parseXmlMap(parser);

					Log.d("tag", JSON.toJSONString(resultMap));
				}
			}
		} catch (PackageManager.NameNotFoundException e) {
			e.printStackTrace();
			// 处理未找到应用的情况
		} catch (IOException e){
			e.printStackTrace();
		}catch (XmlPullParserException e){
			e.printStackTrace();
		}catch (Exception e){
			e.printStackTrace();
		}

XML 解析方法:

java 复制代码
/**
	 * 解析map格式的XML文件
	 */
	private Map<String, String> parseXmlMap(XmlResourceParser parser) throws XmlPullParserException, IOException {
		Map<String, String> map = new HashMap<>();

		int eventType = parser.getEventType();
		String currentName = null;
		StringBuilder currentValue = new StringBuilder();

		while (eventType != XmlPullParser.END_DOCUMENT) {
			switch (eventType) {
				case XmlPullParser.START_TAG:
					if ("string".equals(parser.getName())) {
						currentName = parser.getAttributeValue(null, "name");
						currentValue.setLength(0); // 清空StringBuilder
					}
					break;

				case XmlPullParser.TEXT:
					if (currentName != null) {
						currentValue.append(parser.getText());
					}
					break;

				case XmlPullParser.END_TAG:
					if ("string".equals(parser.getName()) && currentName != null) {
						map.put(currentName, currentValue.toString().trim());
						currentName = null;
					}
					break;
			}

			eventType = parser.next();
		}

		return map;
	}

便于理解加个解析2

java 复制代码
/**
	 * 解析 map 格式的 XML(针对你的 <map><string name="key">value</string></map>)
	 */
	private static Map<String, String> parseXmlMap2(XmlPullParser parser) throws XmlPullParserException, IOException {
		Map<String, String> dataMap = new HashMap<>();
		int eventType = parser.getEventType();

		while (eventType != XmlPullParser.END_DOCUMENT) {
			// 只处理 <string> 标签
			if (eventType == XmlPullParser.START_TAG && "string".equals(parser.getName())) {
				// 获取 <string name="key"> 中的 key
				String key = parser.getAttributeValue(null, "name");
				// 获取 <string> 标签内的 value(如 xxx)
				String value = parser.nextText(); // 注意:nextText() 会消耗 END_TAG
				if (key != null && value != null) {
					dataMap.put(key, value);
				}
			}
			eventType = parser.next(); // 移动到下一个事件
		}
		return dataMap;
	}
相关推荐
开开心心就好3 小时前
图片格式转换工具,右键菜单一键转换简化
linux·运维·服务器·python·django·pdf·1024程序员节
徐子童2 天前
网络协议---TCP协议
网络·网络协议·tcp/ip·面试题·1024程序员节
扫地的小何尚4 天前
NVIDIA RTX PC开源AI工具升级:加速LLM和扩散模型的性能革命
人工智能·python·算法·开源·nvidia·1024程序员节
数据皮皮侠AI5 天前
上市公司股票名称相似度(1990-2025)
大数据·人工智能·笔记·区块链·能源·1024程序员节
开开心心就好5 天前
系统清理工具清理缓存日志,启动卸载管理
linux·运维·服务器·神经网络·cnn·pdf·1024程序员节
Evan东少8 天前
[踩坑]笔记本Ubuntu20.04+NvidiaRTX5060驱动+cuda+Pytorch+ROS/Python实现人脸追踪(环境准备)
1024程序员节
不爱编程的小陈9 天前
C/C++每日面试题
面试·职场和发展·1024程序员节
开开心心就好9 天前
右键菜单管理工具,添加程序自定义名称位置
linux·运维·服务器·ci/cd·docker·pdf·1024程序员节
码农三叔10 天前
(4-2-05)Python SDK仓库:MCP服务器端(5)Streamable HTTP传输+Streamable HTTP传输
开发语言·python·http·大模型·1024程序员节·mcp·mcp sdk
西幻凌云14 天前
初始——正则表达式
c++·正则表达式·1024程序员节