您的位置:首页 > 移动开发 > Android开发

(4.6.12.6)Android中<meta-data>的使用

2016-05-25 17:49 555 查看

概念

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方法列在了下面的表中。

java中获取值

TypeBundle 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);


应用

1 :在Activity的应用

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


2:在application的应用。

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


3:在service的应用。

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


4: 在receiver的应用。

<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()呢?

为了避免这种情况:

可以在形如000的字符串前面放个\0空字符,强迫android按照字符串解析000。

在资源文件中指定需要的值,然后在metadata的value中引用此值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: