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;
	}
相关推荐
xsd202411183 小时前
RelateAnything:53M小模型如何把视觉关系检测从50个谓词里解放出来
人工智能·1024程序员节
Brilliantwxx5 小时前
【STM32】 内部 Flash 详解:寄存器逐位拆解 + 工作流程顺序全讲 + EEPROM再实现
stm32·单片机·嵌入式硬件·1024程序员节
一只鹿鹿鹿6 小时前
智算算力、AI-芯片与产品解析(PPT文件)
大数据·运维·网络·人工智能·物联网·1024程序员节
xwz小王子7 小时前
Science Advances 让机器人触觉在重压下继续分辨微小变化
机器人·1024程序员节
小小AK7 小时前
聚水潭售后单到金蝶退货单同步实战:从增量拉取到目标单据落库的全流程拆解
1024程序员节
Ai-_Man12 小时前
Coze扣子还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·1024程序员节
Android系统攻城狮14 小时前
Linux FFmpeg深度解析之av_dump_format调用流程与实战(十一)
linux·运维·服务器·ffmpeg·1024程序员节·音视频进阶
Android系统攻城狮14 小时前
Linux FFmpeg深度解析之avcodec_find_decoder调用流程与实战(十二)
linux·运维·服务器·ffmpeg·1024程序员节·音视频进阶
1-1=014 小时前
.NET Core 文件系统
.net·.netcore·1024程序员节