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;
	}
相关推荐
金融小师妹20 小时前
AI算法视角下非农夜冲击波来袭,黄金高位区间震荡态势的深度神经网络解析
大数据·深度学习·1024程序员节
全栈小53 天前
【数据库】浙人医携手金仓数据库,打造全国首个多院区异构多活容灾架构
数据库·1024程序员节·金仓
CoderYanger5 天前
贪心算法:7.最长连续递增序列
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger5 天前
贪心算法:6.递增的三元子序列
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger5 天前
贪心算法:1.柠檬水找零
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger5 天前
贪心算法:4.摆动序列
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger5 天前
贪心算法:2.将数组和减半的最少操作次数
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger5 天前
贪心算法:8.买卖股票的最佳时机
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger5 天前
贪心算法:3.最大数
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger5 天前
贪心算法:5.最长递增子序列
java·算法·leetcode·贪心算法·1024程序员节