关键说明: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属性给出。
比如我们定义资源
<string name="x_key">resource keystring>
//R
public static final int ic_launcher=0x7f020000;
定义metadata
data
android:name="com.xesam.key_1"
android:value="x_key" />
data
android:name="com.xesam.key_2"
android:value="@string/x_key" />
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可以定义一些稍微复杂的值。
int imageId = meta.getInt("com.xesam.img");
((ImageView) findViewById(R.id.img)).setImageResource(imageId);
形如:
data
android:name="com.xesam.key_1"
android:value="000" />
类似这样的值如果使用bundle.getString()的话是不起作用的,因为Bundle中使用的是形如:
return (String) o;
为了避免这种情况:
1,可以在形如000的字符串前面放个\0空字符,强迫android按照字符串解析000。
2,在资源文件中指定需要的值,然后在metadata的value中引用此值。
附:
//在Activity应用元素。
ActivityInfo info = this.getPackageManager()
.getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");
//在application应用元素。
ApplicationInfo appInfo = this.getPackageManager()
.getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
appInfo.metaData.getString("meta_name");
//在service应用元素。
ComponentName cn = new ComponentName(this, MetaDataService.class);
ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");
//在receiver应用元素。
ComponentName cn = new ComponentName(context, MetaDataReceiver.class);
ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
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" />
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" />
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" />
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