關于Android Manifest中的<meta-data>

語法

<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());
    }
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯(lián)系作者。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,242評論 25 708
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,511評論 0 17
  • 盡管使用暫存區(qū)域的方式可以精心準備要提交的細節(jié),但有時候這么做略顯繁瑣。Git 提供了一個跳過使用暫存區(qū)域的方式,...
    Crazy2015閱讀 243評論 0 0
  • 夜是我的知音 我和月影演繹著高山流水 在暗暗的灌木叢里 自語著相思之情 湖水里倒映出梁祝的愛情 在夜風里晃蕩不定 ...
    長河冬陽閱讀 309評論 2 9
  • 文/老漫 忘了從什么時候開始,你空洞地看著鏡子,每每時間被漸漸的吞噬,鏡子里的那...
    老漫閱讀 493評論 4 4