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;}