当前位置:   article > 正文

Android中meta-data的作用_android meta-data作用

android meta-data作用

关键说明:meta-data和strings的区别在于它们的作用域,strings只能在应用本地被读取,而处于AndroidManifests.xml下的meta-data则是对外界开放的,是向系统注册的信息,系统及外界是可以通过PackageInfo相关API获取到meta-data的信息的,二者关系可以形象一点看待是私有公有的关系。

用途:在多渠道打包时做区别用

概念

meta-data就像其名一样,主要用来定义一些组件相关的配置值。

按照官方定义,metadata是一组供父组件使用的名值对(name-value pair),因此相应的meta-data元素应该定义在相应的组件中。即如果想在activity中使用metadata,那么meta-data必须定义在AndroidManifest.xml的activity声明中。

使用

所有的名值对被包装成Bundle供组件使用,因此使用方式同Bundle。metadata普通值由value属性给出,资源ID由resource属性给出。
比如我们定义资源

  1. <string name="x_key">resource key</string>
  2. //R
  3. public static final int ic_launcher=0x7f020000;
定义metadata


  1. <meta-data
  2. android:name="com.xesam.key_1"
  3. android:value="x_key" />
  4. <meta-data
  5. android:name="com.xesam.key_2"
  6. android:value="@string/x_key" />
  7. <meta-data
  8. android:name="com.xesam.img"
  9. android:resource="@drawable/ic_launcher" />

那么有:

  1. metadata.getString("com.xesam.key_1") ==> "x_key"
  2. metadata.getString("com.xesam.key_2") ==> "resource key"
  3. metadata.getInt("com.xesam.img") ==> 0x7f020000
由于resource指向资源ID,因此用metadata可以定义一些稍微复杂的值。
比如要定义一副图片,则可以用这个,然后在代码中用getInt()取出图片的ID:
  1. int imageId = meta.getInt("com.xesam.img");
  2. ((ImageView) findViewById(R.id.img)).setImageResource(imageId);

使用问题

形如:

  1. <meta-data
  2. android:name="com.xesam.key_1"
  3. 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中引用此值。

示例代码 

附:

  1. //在Activity应用<meta-data>元素。
  2. ActivityInfo info = this.getPackageManager()
  3. .getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
  4. info.metaData.getString("meta_name");
  5. //在application应用<meta-data>元素。
  6. ApplicationInfo appInfo = this.getPackageManager()
  7. .getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
  8. appInfo.metaData.getString("meta_name");
  9. //在service应用<meta-data>元素。
  10. ComponentName cn = new ComponentName(this, MetaDataService.class);
  11. ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
  12. info.metaData.getString("meta_name");
  13. //在receiver应用<meta-data>元素。
  14. ComponentName cn = new ComponentName(context, MetaDataReceiver.class);
  15. ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
  16. info.metaData.getString("meta_name");


读取方法

1> Application

复制代码
<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="application_meta_data"
            android:value="application_meta_data_value" />  <!--可以关联资源ID, 支持多种数据类型 -->
复制代码
复制代码
ApplicationInfo info = null;
        
     try {
         info = getPackageManager()
                   .getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
     } catch (NameNotFoundException e) {
         e.printStackTrace();
     }
Log.v(TAG, "application meta data value:" + info.metaData.getString("application_meta_data"));
复制代码

2> Activity 

<activity
        android:name="fyc.app.testandroid.MainActivity" >
        <meta-data
            android:name="activity_meta_data"
            android:value="activity_meta_data_value" />
</activity>
复制代码
ActivityInfo info = null;
        
    try {
        info = getPackageManager()
                 .getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    }
Log.v(TAG, "activity meta data value:" + info.metaData.getString("activity_meta_data"));
复制代码

 3> Service

<service android:name="fyc.app.testandroid.MyService" >
            <meta-data
                android:name="service_meta_data"
                android:value="service_meta_data_value" />
</service>
复制代码
ServiceInfo info = null;
        
    try {
        info = getPackageManager()
                .getServiceInfo(new ComponentName(this, MyService.class), PackageManager.GET_META_DATA);  //如果在当前组件获取直接使用getcomponentName()
    } catch (NameNotFoundException e) {
            e.printStackTrace();
    }
Log.v(TAG, "service meta data value:" + info.metaData.getString("service_meta_data"));
复制代码

 4> BroadcastReceiver

<receiver android:name="fyc.app.testandroid.MyReceiver" >
        <meta-data
                android:name="receiver_meta_data"
                android:value="receiver_meta_data_value" />
</receiver>
复制代码
ActivityInfo info = null;
        
    try {
        info = getPackageManager()
                .getReceiverInfo(new ComponentName(this, MyReceiver.class), PackageManager.GET_META_DATA);
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    }
Log.v(TAG, "receiver meta data value:" + info.metaData.getString("receiver_meta_data"));
复制代码

 Logcat输出信息 

11:11:46.733: V/MainActivity(571): application meta data value:application_meta_data_value
11:11:46.733: V/MainActivity(571): activity meta data value:activity_meta_data_value
11:11:46.763: V/MainActivity(571): service meta data value:service_meta_data_value
11:11:46.783: V/MainActivity(571): receiver meta data value:receiver_meta_data_value

meta-data官方地址 http://developer.android.com/reference/android/os/Bundle.html



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/652589
推荐阅读
相关标签
  

闽ICP备14008679号