当前位置: 首页 > news >正文

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

首先是数据提供方:

在 AndroidManifest.xml 中进行注册

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

在 res/xml 里面定义文件 shared_data

<?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>  其他场景可以具体适配

		// 目标应用的包名String targetPackage = "com.xx.xx.xx";Map<String, String> resultMap = new HashMap<>();try {// 获取PackageManagerPackageManager pm = getPackageManager();// 获取定义数据应用的ApplicationInfo (需要知道其包名)ApplicationInfo ai = pm.getApplicationInfo(targetPackage, PackageManager.GET_META_DATA);Bundle metaData = ai.metaData;if (metaData != null) {// 获取资源ID,使用你在meta-data中设置的nameint 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 解析方法:

/*** 解析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

/*** 解析 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"> 中的 keyString key = parser.getAttributeValue(null, "name");// 获取 <string> 标签内的 value(如 xxx)String value = parser.nextText(); // 注意:nextText() 会消耗 END_TAGif (key != null && value != null) {dataMap.put(key, value);}}eventType = parser.next(); // 移动到下一个事件}return dataMap;}

http://www.dtcms.com/a/523623.html

相关文章:

  • Android中Window和LayoutParams的常用属性及常用方法介绍
  • MySQL的安装与卸载
  • 单调栈详解【C/C++】
  • 智慧用电平台让安全走在事故前面
  • 自己的商标名称可以做网站名称吗单页手机网站源码
  • 做网站设计的电脑需要什么配置公司网站首页图片素材
  • Kubernetes网络通信与Pod基础详解:从架构图看K8s核心组件
  • freeRTOS学习日记
  • 划分字母区间---超全详细解
  • 【机器学习】k近邻法
  • 如何使用vscode和express开发node.js
  • Metasploit网络嗅探实战:从数据包捕获到协议分析的完整指南
  • CICD实战(11) - 使用Arbess+GitLab实现PHP项目自动化部署
  • 南京需要做网站的公司施工企业汛期应急预案
  • HarmonyOS 超级终端与服务卡片开发:打造无缝多设备交互体验
  • TeamViewer 手机版:一键远程控制,深度管理,提升多设备管理效率
  • Day70 基于 Mailbox 机制的多线程传感器数据处理系统设计与实现
  • ORM 使用说明
  • 为什么要做手机网站百媚导航app入口app入口
  • 第八章-Tomcat调试与监控
  • 算法基础篇(8)贪心算法
  • 第二章-Tomcat核心架构拆解
  • 带你深度了解作用域和闭包
  • 【Mac下通过Brew安装Ollama 】部署 DeepSeek 轻量模型(实测版)
  • 微信网站用什么语言开发wordpress4.9.4 安装
  • 如何在百度提交自己的网站简要列举网站常见类型
  • 机器视觉HALCON:5.图像标定
  • 【跟小嘉学习JavaWeb开发】第三章 从数据类型说起
  • CTF WEB入门 爆破篇
  • NAT网络地址转换