什么是元数据?它在android中有什么用

What is metadata ? And what is the use of it in android

我是 android 的新手,之前从未见过或听说过元数据。但是我 google 它并在 YouTube 上搜索它,它基本上是您对象的信息。如果我错了,请纠正我。谁能帮助我更好地理解它。

1) 什么是元数据?

2) 为什么用在Android中?

最好能举例说明为什么在Android中使用元数据。我在清单的 activity 元数据标签中看到了它们。

举个简单的例子。它有助于查找其他信息 -- 是元数据的基本解释。

317-745-4618

如果我添加的元数据是一个 phone 数字,那么您就知道或者可以从中算出地理区域。如果我没有说明它是一个 phone 数字,那么你就没有足够的元数据来知道这是什么对象。它可能是美国 SSN,也可能是其他东西。

它在 Android 中用于将对象添加到清单,例如,如果使用 Google 服务,将添加它以指定应用程序绑定到的 Google 服务版本。

Metadata is data that describes other data to inform other applications how to use the data itself.

Android用法:
意图就是一个很好的例子——如果你想在意图中传递数据,它必须是原始的,因为 Android 只有关于这些对象的预构建元数据。 (字符串和整数具有系统知道如何使用的不同二进制结构)。

意图还允许您通过 Parcel class (this process of manually build you own metadata called marshalling)

为自定义对象构建自己的元数据

在Android中,您可以在AndroidManifest.xml

中定义meta-data信息

HERE IS THE DOCK LINK

非常基本的用法

它基本上是一个附加选项,用于存储可在整个项目中访问的信息。在这种情况下,<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");

您可以保存 booleanintString 或浮点数。

对图书馆有用或者APIs

假设您创建了一个可供所有人使用的 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 广告 (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" />

这将用 @integer/google_play_services_version 表示的值加载 com.google.android.gms.version。然后,Google Play Services (Admob) 可能会读取此 metadata 并且它将能够确定您在使用时使用的 Google Play Service 的版本构建您的应用程序。

另一个例子

<meta-data> 的另一个用法是何时使用它们来配置 Activity。通过这种方式,您可以将有关您的 activity 的有价值信息传递给 android,然后 Android 可以正确处理您的 activity。 在这种情况下,<meta-data> 标签被添加到 <activity> 标签内。

我看到的第一个例子是定义搜索 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>

然后,要从 activity 标签中获取元数据,请使用:

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