語法
<meta-data
android:name="string"
android:resource="resource specification"
android:value="string" />
<meta-data>是一個鍵值對,用來為父控件存儲多余的數(shù)據(jù)。一個控件可以包含任意數(shù)量的<meta-data>,這些值都存儲在單個Bundle對象中,并作為PackageItemInfo.metaData
字段提供給父控件。
屬性
-
android:name
:該item的唯一名稱。為了保證其名字唯一性,可以使用 Java 命名風格 -
android:resource
:對資源的引用。其值為資源的ID,可以通過該Bundle的Bundle.getIn()
方法獲取其ID值 -
android:value
:分配給該item的值。更多類型及介紹見官網(wǎng)文檔
用法
在Android中,可以在 AndroidManifest.xml
中定義meta-data
信息。
基本用法
最基本的用法增加item用來存儲信息,且該信息可以被整個項目所使用。這時,<meta-data>
定義在<activity>
外面,且在<application>
內(nèi),例如:
<manifest>
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
<meta-data android:name="my_test_metagadata" android:value="testValue" />
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<manifest>
讀取時如下:
ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
Bundle bundle = ai.metaData;
String myApiKey = bundle.getString("my_test_metagadata");
其中,可以存儲的類型還包括boolean
, int
, string
, float
用于第三方庫或APIs
項目中經(jīng)常需要引用第三方庫或使用其API,但對于詳細的產(chǎn)品,需要一個KEY
來識別,例如:判斷不同的使用者或不同的機型,這個KEY
必須由開發(fā)者定義,并使用相應API,但由于安全性,這個KEY
不可能被共享。
通過使用<meta-data>
,開發(fā)人員可以與使用者共享第三方庫或APIs的KEY
,例子如下:
try {
ApplicationInfo ai = getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
Bundle bundle = ai.metaData;
String myApiKey = bundle.getString("my_test_metagadata");
} catch (Exception e) {
Log.e(TAG, "Dear developer. Don't forget to configure <meta-data android:name=\"my_test_metagadata\" android:value=\"testValue\"/> in your AndroidManifest.xml file.");
}
例如,為了能夠使用 HockeyApp 的 crash report功能,需要在AndroidManifest
中添加如下代碼:
<meta-data android:name="net.hockeyapp.android.appIdentifier" android:value="${HOCKEYAPP_APP_ID}" />
這行代碼會在加載 net.hockeyapp.android.appIdentifier
時使用value值為${HOCKEYAPP_APP_ID}的數(shù)據(jù),所以,HockeyApp 可以知道是哪一臺設備請求獲取crash report功能。
配置Activity
<meta-data>
的另一個應用是配置Activity,通過這種方式,可以為當前Acitivity配置數(shù)據(jù),項目能夠更好的處理Activity。這時,<meta-data>
標簽在<activity>
標簽內(nèi)。例如:
<manifest>
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SearchableActivity" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
</application>
<manifest>
從<activity>
標簽內(nèi)讀取數(shù)據(jù)可以通過如下方式:
try {
ActivityInfo ai = getPackageManager().getActivityInfo(this.getComponentName(), PackageManager.GET_META_DATA);
Bundle bundle = ai.metaData;
if (bundle != null) {
String apiKey = bundle.getString("apikey");
Log.d(this.getClass().getSimpleName(), "apiKey = " + apiKey);
}
}
} catch (PackageManager.NameNotFoundException e) {
Utilities.log(this.getClass().getSimpleName(), "Failed to load meta-data, NameNotFound: " + e.getMessage());
} catch (NullPointerException e) {
Log.e(this.getClass().getSimpleName(), "Failed to load meta-data, NullPointer: " + e.getMessage());
}