首先是数据提供方:
在 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;
}