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;
	}
相关推荐
学传打活2 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
fangzhanpeng16810 天前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心12 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u01030552718 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u01030552718 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝19 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u01030552720 天前
Java图像处理实战指南
人工智能·1024程序员节
u01030552720 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u01030552722 天前
Java实用类应用精讲
人工智能·1024程序员节
u01030552723 天前
Java I/O核心操作实战
人工智能·1024程序员节