在 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" />,则在不同父元素中读取方法如下所示:
1、读取<application>中的<meta-data>
1 import android.content.pm.ApplicationInfo; 2 import android.content.pm.PackageManager; 3 import android.content.pm.PackageManager.NameNotFoundException; 4 try 5 { 6 ApplicationInfo info = this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); 7 String value = info.metaData.getString("test_name"); 8 } 9 catch (NameNotFoundException e) 10 { 11 e.printStackTrace(); 12 }
2、读取<activity>中的<meta-data>
1 import android.content.pm.ActivityInfo; 2 import android.content.pm.PackageManager; 3 import android.content.pm.PackageManager.NameNotFoundException; 4 try 5 { 6 ActivityInfo info = this.getPackageManager().getActivityInfo(getPackageName(), PackageManager.GET_META_DATA); 7 String value = info.metaData.getString("test_name"); 8 } 9 catch (NameNotFoundException e) 10 { 11 e.printStackTrace(); 12 }
3、读取<service>中的<meta-data>
1 ComponentName cn = new ComponentName(this, MetaDataService.class); 2 ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA); 3 String value = info.metaData.getString("test_name");
4、读取<receiver>中的<meta-data>
1 ComponentName cn = new ComponentName(context, MetaDataReceiver.class); 2 ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA); 3 String value = info.metaData.getString("test_name");