在AndroIDManifest.xml清单文件中 我们有时会看到如下类似的<Meta-data ... >元素开始的配置内容:
[HTML] view plain copy <Meta-data androID:name="com.Google.androID.maps.v2.API_KEY" androID:value="AIzaSyBhBFOgVQclaa8p1JJeqaZHiCo2nfiyBBo" /> <Meta-data androID:name="com.Google.androID.gms.version" androID:value="@integer/Google_play_services_version" />标签<Meta-data>是提供组件额外的数据用的,它本身就是一个键值对,可以自定义名称和值。它可以包含在以下组件当中:
<activity>、<application> 、<service> 和 <receiver>
一、如何配置<mate-data...>元素:
标签<Meta-data>元素的配置语法如下:
[HTML] view plain copy <Meta-data androID:name="string" androID:resource="resource specification" androID:value="string" />说明:一般的值可以通过value属性来指定,但是如果要指定一个资源的ID,则需要使用resource属性来配置。
如以下配置内容:
[HTML] view plain copy <Meta-data androID:name="API_key" androID:value="@string/API_key" />指定的API_key值为存储在资源文件string中的API_key值 如:AIzaSyBhBFOgVQclaa8p1JJeqaZHiCo2nfiyBBo
如以下配置内容:
指定的resID值则是为res_ID的资源ID号 而不是string中的res_ID值
二、如何获取<mate-data...>元素配置的值:
1、在<application...>元素下配置<mate-data...>元素
xml代码段:
Java代码段:
[java] view plain copy try { ApplicationInfo appInfo = getPackageManager().getApplicationInfo(getPackagename(), PackageManager.GET_Meta_DATA); String value = appInfo.MetaData.getString("API_key"); Log.d("Tag", " app key : " + value); // Tag﹕ app key : AIzaSyBhBFOgVQclaa8p1JJeqaZHiCo2nfiyBBo } catch (PackageManager.nameNotFoundException e) { e.printstacktrace(); }
2、在<activity...>元素下配置<mate-data...>元素
xml代码段:
Java代码段:
[java] view plain copy try { ActivityInfo activityInfo = getPackageManager().getActivityInfo(getComponentname(), PackageManager.GET_Meta_DATA); // 获取到的是 @string/ice 对应的资源ID值 int value = activityInfo.MetaData.getInt("resource_ID"); Log.d("Activity Tag", "resource_ID : " + value); // Activity Tag﹕ resource_ID : 2131361808 } catch (PackageManager.nameNotFoundException e) { e.printstacktrace(); }
3、在<service...>元素下配置<mate-data...>元素
xml代码段:
[HTML] view plain copy <service androID:name="MetaDataService"> ..... <Meta-data androID:name="service_Meta_data" androID:value="xxxxxxx" /> </service>Java代码段:
[java] view plain copy try { Componentname cn=new Componentname(this, MetaDataService.class); ServiceInfo info=this.getPackageManager() .getServiceInfo(cn, PackageManager.GET_Meta_DATA); String value = info.MetaData.getString("service_Meta_data"); Log.d("Service TAG", " value == " + value); } catch (PackageManager.nameNotFoundException e) { e.printstacktrace(); }
4、在<receiver...>元素下配置<mate-data...>元素
xml代码段:
Java代码段:
[java] view plain copy try { Componentname cn=new Componentname(this, MetaDataReceiver.class); ActivityInfo info=context.getPackageManager() .getReceiverInfo(cn, PackageManager.GET_Meta_DATA); String value = info.MetaData.getString("receiver_Meta_data"); Log.d("Receiver TAG", " value == " + value); } catch (PackageManager.nameNotFoundException e) { e.printstacktrace(); }Meta-data
是应用的清单文件AndroIDManifest.xml
中application
,activity
,activity-alias
,provIDer
,receiver
,service
下的子标签,比intent-filter
多些父标签.像友盟这些统计服务一般只需要一个AppID等,只需要定义在Application中,如果你想给某个组件添加Meta-data,那么Meta-data
必须定义在其组件申明内。
事实上,Meta-data
我们拿到的时候是一个Bundle
,知道了这一点,我们就可以不畏惧它了,不信你看。
public Bundle MetaData;
先看一下应用场景,在Application中定义APPID, 我们也可以直接给一个resource给Meta-data
<application .... <Meta-data androID:name="jerey" androID:value="sdf123456"> </Meta-data> </application>获取Application中的Meta-data方法:
ApplicationInfo appInfo = null; appInfo = this.getPackageManager() .getApplicationInfo(getPackagename(), PackageManager.GET_Meta_DATA); Bundle bundle = appInfo.MetaData; Log.i(TAG, "bundle.getString(jerey) : " + bundle.getString("jerey"));可以看到打印为:
I/MainActivity: bundle.getString("jerey") : sdf123456
若我们像下面这种方式使用:
<string-array name="test1"> <item>test1_hello</item> <item>test1_hello2</item> </string-array> <Meta-data androID:name="test_array" androID:resource="@array/test1"> </Meta-data>在获取时,获取到的是ID,R.ID的ID,我们还需要getResource.get...去获取。我们测试一下:
int ID = bundle.getInt("test_array"); String[] aString = getResources().getStringArray(ID); for (int i = 0; i < aString.length; i++) { Log.i(TAG, "onCreate: " + aString[i]); }logcat可以看到:
10-17 15:57:55.966 5247-5247/avatar.com.demos I/MainActivity: onCreate: test1_hello 10-17 15:57:55.966 5247-5247/avatar.com.demos I/MainActivity: onCreate: test1_hello2既然知道了如何获取Application
中的参数,那么其他的也如出一辙。
举一个扩展应用场景,我们都知道,AndroID系统的多应用打开功能,即比如你有三个浏览器,那么我们发送一个url
的时候,如果没有默认浏览器,会让我们选择一个浏览器。
现在我们喜欢,d出的选择界面多一点介绍,每个能够接收这个Action的应用都能够做一下自我介绍,在选择的界面上下面显示小字提示。
这个需求,我们肯定不是说提前记住每个应用的介绍,并且这种肯定是要控制反转,即每个应用单独提供自己的介绍的。这个时候Meta-data
就起到作用了,我们可以让每个做公共跳转的应用的Activity都添加一个叫Title
的Meta-data
,那么我们就能获取到它,怎么获取呢,看下面 *** 作,(我居然能突然奇想到这个例子,OMG)
*** 作1,利用PackageManager查询Intent的功能,这个功能常用来判断一个Intent是否有接收者的,比如从相册选择图片,为了防止没有相册往往会做这样的判断。
Intent intent = new Intent(); intent.setAction("androID.intent.action.VIEW"); PackageManager packageManager = getPackageManager(); List<ResolveInfo> activitIEs = packageManager.queryIntentActivitIEs(intent, PackageManager.GET_ACTIVITIES);拿到List<ResolveInfo> activitIEs
,接下来干什么?
总结
以上是内存溢出为你收集整理的Manifest中meta-data扩展元素数据的配置与获取全部内容,希望文章能够帮你解决Manifest中meta-data扩展元素数据的配置与获取所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)