meta-data就像其名一样,主要用来定义一些组件相关的配置值。
按照官方定义,metadata是一组供父组件使用的名值对(name-value pair),因此相应的meta-data元素应该定义在相应的组件中。即如果想在activity中使用metadata,那么meta-data必须定义在AndroidManifest.xml的activity声明中。
这是该元素的基本结构.可以包含在
< activity> < activity-alias> < service> < receiver>四个元素中。
<meta-data Android:name="string"
android:resource="resource specification"
android:value="string" />
android:name
元数据项的名字,为了保证这个名字是唯一的,采用Java风格的命名规范。例如: com.example.project.activity.fred
android:resource
资源的一个引用,指定给这个项的值是该资源的id。该id可以通过方法Bundle.getInt()来从meta-data中找到。
android:value
指定给这一项的值。可以作为值来指定的数据类型并且组件用来找回那些值的Bundle方法列在了下面的表中。
Type | Bundle method |
---|---|
String value, using double backslashes (//) to getString() escape characters — such as”//n” and “//uxxxxx” for a Unicode character. | getString() |
Integer value, such as “100” | getInt() |
Boolean value, either “true” or “false” | getBoolean() |
Color value, in the form “#rgb”, “#argb”, “#rrggbb”, or “#aarrggbb” | getString() |
Float value, such as “1.23” | getFloat() |
<meta-data
android:name="com.xesam.key_1"
android:value="x_key" />
<meta-data
android:name="com.xesam.key_2"
android:value="@string/x_key" />
<meta-data
android:name="com.xesam.img"
android:resource="@drawable/ic_launcher" />
metadata.getString("com.xesam.key_1") ==> "x_key"
metadata.getString("com.xesam.key_2") ==> "resource key"
metadata.getInt("com.xesam.img") ==> 0x7f020000
由于resource指向资源ID,因此用metadata可以定义一些稍微复杂的值。
比如要定义一副图片,则可以用这个,然后在代码中用getInt()取出图片的ID:
int imageId = meta.getInt("com.xesam.img");
((ImageView) findViewById(R.id.img)).setImageResource(imageId);
<activity...>
<meta-data android:name="myMsg" android:value="hello my activity"></meta-data>
</activity>
ActivityInfo info=this.getPackageManager().getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
String msg=info.metaData.getString("myMsg");
System.out.println("myMsg:"+msg);
<application...>
<meta-data android:value="hello my application" android:name="myMsg"></meta-data>
</application>
ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
String msg=appInfo.metaData.getString("myMsg");
System.out.println("myMsg:"+msg);
<service android:name="MetaDataService">
<meta-data android:value="hello my service" android:name="myMsg"></meta-data>
</service>
ComponentName cn=new ComponentName(this,MetaDataService.class);
ServiceInfo info=this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
String msg=info.metaData.getString("myMsg");
System.out.println("myMsg:"+msg);
<receiver android:name="MetaDataReceiver">
<meta-data android:value="hello my receiver" android:name="myMsg"></meta-data>
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"></action>
</intent-filter>
</receiver>
ComponentName cn=new ComponentName(context, MetaDataReceiver.class);
ActivityInfo info=context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
String msg=info.metaData.getString("myMsg");
System.out.println("myMsg:"+msg);
形如:
<meta-data
android:name="com.xesam.key_1"
android:value="000" />
类似这样的值如果使用bundle.getString()的话是不起作用的,因为Bundle中使用的是形如:
return (String) o;
的代码获取一个StringValue值的,但是在将metadata包装成bundle的时候,”000”被解析成整数0,
因此bundle.getString(“com.xesam.key_1”)返回的是(String)0,显然,java是不允许这样的,因此最后得到的是null。 话说android为什么不是用String.valueOf()或者obj.toString()呢?
为了避免这种情况: