Android----<meta-data>简要学习使用

meta-data是什么?

标签meta-data的官方介绍链接:查看Android官方解释

meta-data是Android的Manifest文件内activity,activity-alias,application,provider,receiver,service组件下的子标签。用于标识供父组件使用的键值对(name-value pair),如果想在activity中使用meta-data,那么meta-data必须定义在AndroidManifest.xml的activity组件中声明。

如何使用?

meta-data的使用就跟一般的键值对使用一样,在对应的组件下声明name和value如下:

<meta-data android:name="zoo" android:value="@string/kangaroo" />

若要提供比较复杂的数据,可以使用android:resource提供该资源的ID:

<meta-data android:name="com.xesam.img" android:resource="@drawable/ic_launcher" />

在代码内获取meta-data

    //在Activity应用<meta-data>元素。
    ActivityInfo info = this.getPackageManager()
            .getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
    info.metaData.getString("zoo");
    info.metaData.getInt("com.xesam.img")  ==>获得图片资源对应的资源索引0x7f020000

    //在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");

一般使用场景

使用第三方服务提供的开放API,例如:第三方微信、微博登陆,第三方社交通讯融云SDK、百度/讯飞语音识别SDK等,需要注册对应的账户获取加入第三方服务提供的AppKey、AppSecret;然后在使用SDK时加入这些appKey/appSecret,这时一般采用的都是在应用的Manifest文件application组件下加入指定key供SDK使用者填入申请获得的对应值。

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <!-- begin: baidu speech sdk -->
        <!-- 请填写真实的APP_ID API_KEY SECRET_KEY -->
        <meta-data
            android:name="com.baidu.speech.APP_ID"
            android:value="000000" />
        <meta-data
            android:name="com.baidu.speech.API_KEY"
            android:value="****************" />
        <meta-data
            android:name="com.baidu.speech.SECRET_KEY"
            android:value="******************" />

扩展使用

由于meta-data提供的键值对数据是放在PackageItemInfo.metaData内,故而其它应用通过管理获取到该应用的包信息从而获取到对应组件的meta-data。
下面的例子为:Android 5.1下锁屏应用通过PackageManager查询匹配给定intent的默认activity组件并且获取activity组件下提供的META_DATA_KEYGUARD_LAYOUT。

        <activity
            android:name="com.android.camera.SecureCameraActivity"
            android:clearTaskOnLaunch="true"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:excludeFromRecents="true"
            android:label="@string/app_name"
            android:taskAffinity="com.android.camera.SecureCameraActivity"
            android:theme="@style/Theme.Camera"
            android:windowSoftInputMode="stateAlwaysHidden|adjustPan" >
            <intent-filter>
                <action android:name="android.media.action.STILL_IMAGE_CAMERA_SECURE" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.media.action.IMAGE_CAPTURE_SECURE" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

            <meta-data
                android:name="com.android.keyguard.layout"
                android:resource="@layout/keyguard_widget" />
        </activity>

    ............
        ....................
    private static final String META_DATA_KEYGUARD_LAYOUT = "com.android.keyguard.layout";
        ...................
        intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE)
        PackageManager packageManager = mContext.getPackageManager();
        final List<ResolveInfo> appList = packageManager.queryIntentActivitiesAsUser(
                intent, PackageManager.MATCH_DEFAULT_ONLY, mLockPatternUtils.getCurrentUser());
        if (appList.size() == 0) {
            return null;
        }
        ResolveInfo resolved = packageManager.resolveActivityAsUser(intent,
                PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_META_DATA,
                mLockPatternUtils.getCurrentUser());
        if (wouldLaunchResolverActivity(resolved, appList)) {
            return null;
        }
        if (resolved == null || resolved.activityInfo == null) {
            return null;
        }
        if (resolved.activityInfo.metaData == null || resolved.activityInfo.metaData.isEmpty()) {
            return null;
        }
        int layoutId = resolved.activityInfo.metaData.getInt(META_DATA_KEYGUARD_LAYOUT);
        ..............
        ......................
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值