Ответ 1
В Android вы можете определить meta-data
информацию в AndroidManifest.xml
Очень простое использование
Это, в основном, дополнительный способ хранения информации, доступ к которой возможен через весь проект. В этом случае <meta-data>
определяется вне тега <activity>
и внутри тега <application>
.
Определение:
<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.
Он полезен для библиотеки или API
Скажем, что вы создали API/LIB, который можно использовать для всех. Однако для конкретной процедуры вам понадобится KEY
и что KEY
должен быть определен разработчиком, который будет использовать ваш API.
Таким образом, вы не можете предсказать, какой ключ будет разделять разработчик.
Используя <meta-data>
, разработчик, который хочет использовать ваш API/LIB, может совместно использовать KEY
с вами. Таким образом, вы оставляете свой API настроенным для чтения этого 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.");
}
Один классический пример - Google Ads (Admob).
Вы должны добавить следующую строку в свой AndroidManifest
:
<!--This meta-data tag is required to use Google Play Services. (adMob)-->
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
Это загрузит com.google.android.gms.version
со значением, представленным @integer/google_play_services_version
. Тогда, возможно, Google Play Services (Admob) прочитает эти метаданные, и он сможет определить версию Службы Google Play, которую вы использовали при создании своего приложения.
Другой пример
Другое использование для <meta-data>
- это когда использовать их для настройки Activity. Таким образом, вы можете передавать важную информацию в андроид о своей деятельности, а затем Android может правильно обрабатывать вашу деятельность.
В этом случае тег <meta-data>
добавляется внутри тега <activity>
.
Первый пример, который я вижу, - это когда вы определяете активность поиска.
<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>
Затем, чтобы получить метаданные из тега активности, используйте это:
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());
}