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;
	}
相关推荐
百锦再6 小时前
Python、Java与Go:AI大模型时代的语言抉择
java·前端·vue.js·人工智能·python·go·1024程序员节
笑对人生任我行6 小时前
ORM 使用说明
1024程序员节
杨筱毅7 小时前
【底层机制】【Android】【面试】Zygote 为什么使用 Socket 而不是 Binder?
android·1024程序员节·底层机制
阿部多瑞 ABU7 小时前
# AI高精度提示词生成项目——3D-VR 课件—— 最终仓库级 AI 提示词:生成《EduVR Studio》—— 专业级 3D-VR 课件创作平台
gitee·开源·github·aigc·ai编程·1024程序员节
vvvdg7 小时前
求下列线性变换的矩阵
线性代数·矩阵·1024程序员节
hazy1k7 小时前
51单片机基础-DS1302时钟
stm32·单片机·嵌入式硬件·51单片机·1024程序员节
知花实央l7 小时前
【数字逻辑】 74HC74转JK触发器+74HC112做二分频+74HC161设计10进制计数器(附接线图)
1024程序员节
阿洛学长8 小时前
高质量 AI 提示词之(从 0-1 开发 Vue 项目)
vue·ai编程·1024程序员节
半梦半醒*8 小时前
ELK2——logstash
linux·运维·elk·elasticsearch·centos·1024程序员节