在 AndroidManifest.xml 中,<meta-data>元素是一个键值对,往往被包含在<application> 、<activity>、<service>和<receiver>等元素中,但是不同父元素中<meta-data>读取方法也不同。
<meta-data>基本结构:<meta-data android:name="string" android:resource="resource specification" android:value = "string" /> (其中resource、value两者选其一),一个组件元素能够包含任意数量的<meta-data>子元素,它们所有的值都会被收集在Bundle对象中,作为组件的 PackageItemInfo.metaData 字段。
android:name 元数据项的名字,需保证唯一性。
android:resource 资源的一个引用,指定给这个项的值是该资源的id。该id可通过bundle.getInt()从<meta-data>中获取。
android:value 指定给这一项的值,可以作为值来指定的数据类型并且组件用来找回那些值的Bundle方法如下。
数据类型 | 示例 | 获取方法 |
字符串 | "abcd" | getString() |
整数 | "1" | getInt() |
布尔 | "true" | getBoolean() |
颜色 | "#rgb", "#argb", "#rrggbb" | getInt() |
浮点 | "1.1" | getFloat() |
一般的值可以通过value属性来指定,但是如果要指定一个资源id作为一个值,那么就要用resource属性来代替。假如 <meta-data android:name="test_name" android:value="test_value" />,则在不同父元素中读取方法如下所示:
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
try
{
ApplicationInfo info = this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
String value = info.metaData.getString("test_name");
}
catch (NameNotFoundException e)
{
e.printStackTrace();
}
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
try
{
ActivityInfo info = this.getPackageManager().getActivityInfo(getPackageName(), PackageManager.GET_META_DATA);
String value = info.metaData.getString("test_name");
}
catch (NameNotFoundException e)
{
e.printStackTrace();
}
ComponentName cn = new ComponentName(this, MetaDataService.class);
ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
String value = info.metaData.getString("test_name");
ComponentName cn = new ComponentName(context, MetaDataReceiver.class);
ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
String value = info.metaData.getString("test_name");