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

来源:互联网 发布:淘宝面具 编辑:程序博客网 时间:2024/06/06 20:10

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);        ..............        ......................
0 0
原创粉丝点击