Manifest中meta-data扩展元素数据的配置与获取

Manifest中meta-data扩展元素数据的配置与获取,第1张

概述简介-meta是什么  在AndroidManifest.xml清单文件中我们有时会看到如下类似的<meta-data...>元素开始的配置内容:[html] viewplain copy <meta-data      android:name="com.google.android.maps.v2.API_KEY"      android:value="AIzaSyBhBFOgVQ 简介-Meta是什么

 

 在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

如以下配置内容:

[HTML] view plain copy <Meta-data androID:name="resID" androID:resource="@string/res_ID" />  

指定的resID值则是为res_ID的资源ID号 而不是string中的res_ID值


二、如何获取<mate-data...>元素配置的值:
1、在<application...>元素下配置<mate-data...>元素
xml代码段:

[HTML] view plain copy <application...>      .....      <Meta-data            androID:name="API_key"            androID:value="AIzaSyBhBFOgVQclaa8p1JJeqaZHiCo2nfiyBBo" />  </application>  

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代码段:

[HTML] view plain copy <activity ...>      .....      <Meta-data androID:name="resource_ID"            androID:resource="@string/ice" />  </activity>  

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代码段:

[HTML] view plain copy <receiver androID:name="MetaDataReceiver">        .....        <Meta-data androID:name="receiver_Meta_data" androID:value="xxxxxxx" />  </receiver>  

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.xmlapplication,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中的参数,那么其他的也如出一辙。

 //在Activity应用<Meta-data>元素。 ActivityInfo info = this.getPackageManager() .getActivityInfo(getComponentname(),PackageManager.GET_Meta_DATA); info.MetaData.getString("Meta_name");    //在service应用<Meta-data>元素。  Componentname cn = new Componentname(this, ×××Service.class); ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_Meta_DATA);  info.MetaData.getString("Meta_name");    //在receiver应用<Meta-data>元素。 Componentname cn = new Componentname(context, ×××Receiver.class);  ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_Meta_DATA); info.MetaData.getString("Meta_name"); 扩展应用-配合PackageManager

举一个扩展应用场景,我们都知道,AndroID系统的多应用打开功能,即比如你有三个浏览器,那么我们发送一个url的时候,如果没有默认浏览器,会让我们选择一个浏览器。

 Intent intent = new Intent();  intent.setAction("androID.intent.action.VIEW");  Uri content_url = Uri.parse("https://www.baIDu.com");  intent.setData(content_url); startActivity(intent);

现在我们喜欢,d出的选择界面多一点介绍,每个能够接收这个Action的应用都能够做一下自我介绍,在选择的界面上下面显示小字提示。

这个需求,我们肯定不是说提前记住每个应用的介绍,并且这种肯定是要控制反转,即每个应用单独提供自己的介绍的。这个时候Meta-data就起到作用了,我们可以让每个做公共跳转的应用的Activity都添加一个叫TitleMeta-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,接下来干什么?

 for (ResolveInfo info : activitIEs) { ActivityInfo mActivityInfo = info.activityInfo; mActivityInfo.packagename; mActivityInfo.name; Bundle data = info.activityInfo.MetaData; }  

 

总结

以上是内存溢出为你收集整理的Manifest中meta-data扩展元素数据的配置与获取全部内容,希望文章能够帮你解决Manifest中meta-data扩展元素数据的配置与获取所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1120907.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存