[Android記錄]meta-data小結

概念

meta-data就像其名同樣,主要用來定義一些組件相關的配置值。 html

按照官方定義,metadata是一組供父組件使用的名值對(name-value pair),所以相應的meta-data元素應該定義在相應的組件中。即若是想在activity中使用metadata,那麼meta-data必須定義在AndroidManifest.xml的activity聲明中。 java

使用

全部的名值對被包裝成Bundle供組件使用,所以使用方式同Bundle。metadata普通值由value屬性給出,資源ID由resource屬性給出。
好比咱們定義資源
android

<string name="x_key">resource key</string>
//R
public static final int ic_launcher=0x7f020000;
定義metadata


<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" />

那麼有: app

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

使用問題

形如: this

<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中引用此值。 spa

示例代碼

附: code

//在Activity應用<meta-data>元素。
    ActivityInfo info = this.getPackageManager()
            .getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
    info.metaData.getString("meta_name");

    //在application應用<meta-data>元素。
    ApplicationInfo appInfo = this.getPackageManager()
            .getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
    appInfo.metaData.getString("meta_name");

    //在service應用<meta-data>元素。
    ComponentName cn = new ComponentName(this, MetaDataService.class);
    ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
    info.metaData.getString("meta_name");

    //在receiver應用<meta-data>元素。
    ComponentName cn = new ComponentName(context, MetaDataReceiver.class);
    ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
    info.metaData.getString("meta_name");


meta-data官方地址 http://developer.android.com/reference/android/os/Bundle.html
相關文章
相關標籤/搜索