(4.6.12.6)Android中的使用

概念

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中获取值

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

应用

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

为了避免这种情况:

  1. 可以在形如000的字符串前面放个\0空字符,强迫android按照字符串解析000。
  2. 在资源文件中指定需要的值,然后在metadata的value中引用此值。

你可能感兴趣的:((4.6.12.6)Android中的使用)