Android 读取<meta-data>元素的数据

来源:互联网 发布:qt淘宝兼职平台下载 编辑:程序博客网 时间:2024/06/07 09:30

转载: Android 读取<meta-data>元素的数据



很多时候我们需要在Android Manifest 清单文件中的 Activity、Service、BroadcastReceiver或者Application节点上配置一些称为 元数据的信息,然后在程序启动的时候去获取清单文件中配置的元数据信息。例如 友盟统计SDK的 API Key 和 Channel ID,都是在清单文件中进行配置的。

在AndroidManifest.xml中,<meta-data>元素可以作为子元素,被包含在<activity>、<application> 、<service>和<receiver>元素中,但
不同的父元素,在应用时读取的方法也不同,下面通过一个demo工程来演示如何读取meta-data 数据。


Android Manifest 文件

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.metadatatest"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="8" />  
  10.   
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@style/AppTheme" >  
  16.           
  17.         <meta-data android:name="mTag" android:value="@string/meta_application"></meta-data>  
  18.           
  19.         <activity  
  20.             android:name="com.example.metadatatest.MainActivity"  
  21.             android:label="@string/app_name" >  
  22.             <intent-filter>  
  23.                 <action android:name="android.intent.action.MAIN" />  
  24.   
  25.                 <category android:name="android.intent.category.LAUNCHER" />  
  26.             </intent-filter>  
  27.               
  28.             <!-- 一般的值可以通过value属性来指定,但是如果要指定一个资源id作为一个值,那么就要用resource属性来代替。 -->  
  29.             <meta-data android:name="mTag" android:value="@string/meta_activity"></meta-data>  
  30.               
  31.             <!--利用resource属性将指定 mResource 的资源id号-->  
  32.             <meta-data android:name="mResource" android:resource="@drawable/ic_launcher"></meta-data>  
  33.         </activity>  
  34.           
  35.         <service android:name="com.example.metadatatest.service.DemoService">  
  36.             <meta-data android:name="mTag" android:value="@string/meta_service"></meta-data>  
  37.         </service>  
  38.           
  39.         <receiver android:name="com.example.metadatatest.receiver.DemoReceiver">  
  40.             <intent-filter android:priority="1000">  
  41.                 <action android:name="android.intent.action.BOOT_COMPLETED"/>  
  42.             </intent-filter>  
  43.             <meta-data android:name="mTag" android:value="@string/meta_broadcast"></meta-data>  
  44.         </receiver>  
  45.           
  46.     </application>  
  47.   
  48. </manifest>  



这个名字值是额外的任意的可以提供给父组件的数据。一个组件元素能够包含任意数量的meta-data子元素。它们所有的值都会被收集在Bundle对象中并且使其可以作为组件的 PackageItemInfo.metaData 字段。 
一般的值可以通过value属性来指定,但是如果要指定一个资源id作为一个值,那么就要用resource属性来代替。



MainActivity 代码

[java] view plain copy
  1. package com.example.metadatatest;  
  2.   
  3. import com.example.metadatatest.receiver.DemoReceiver;  
  4. import com.example.metadatatest.service.DemoService;  
  5. import android.app.Activity;  
  6. import android.content.ComponentName;  
  7. import android.content.pm.ActivityInfo;  
  8. import android.content.pm.ApplicationInfo;  
  9. import android.content.pm.PackageManager;  
  10. import android.content.pm.PackageManager.NameNotFoundException;  
  11. import android.content.pm.ServiceInfo;  
  12. import android.os.Bundle;  
  13. import android.util.Log;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. import android.widget.Button;  
  17. import android.widget.ImageView;  
  18.   
  19. public class MainActivity extends Activity implements OnClickListener {  
  20.     private static final String TAG = MainActivity.class.getSimpleName();  
  21.     private ImageView iv_pic;  
  22.   
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.activity_main);  
  27.   
  28.         findView();  
  29.     }  
  30.   
  31.     private void findView() {  
  32.   
  33.         Button bt_read_activity = (Button) findViewById(R.id.bt_read_activity);  
  34.         Button bt_read_service = (Button) findViewById(R.id.bt_read_service);  
  35.         Button bt_read_broadcast = (Button) findViewById(R.id.bt_read_broadcast);  
  36.         Button bt_read_application = (Button) findViewById(R.id.bt_read_application);  
  37.   
  38.         iv_pic = (ImageView) findViewById(R.id.iv_pic);  
  39.           
  40.         bt_read_activity.setOnClickListener(this);  
  41.         bt_read_service.setOnClickListener(this);  
  42.         bt_read_broadcast.setOnClickListener(this);  
  43.         bt_read_application.setOnClickListener(this);  
  44.   
  45.     }  
  46.   
  47.     @Override  
  48.     public void onClick(View v) {  
  49.         switch (v.getId()) {  
  50.         case R.id.bt_read_activity:  
  51.             readMetaDataFromActivity();  
  52.   
  53.             break;  
  54.         case R.id.bt_read_service:  
  55.             readMetaDataFromService();  
  56.             break;  
  57.         case R.id.bt_read_broadcast:  
  58.             readMetaDataFromBroadCast();  
  59.             break;  
  60.         case R.id.bt_read_application:  
  61.             readMetaDataFromApplication();  
  62.             break;  
  63.   
  64.         default:  
  65.             break;  
  66.         }  
  67.     }  
  68.   
  69.     /** 
  70.      * 读取application 节点  meta-data 信息 
  71.      */  
  72.     private void readMetaDataFromApplication() {  
  73.         try {  
  74.             ApplicationInfo appInfo = this.getPackageManager()  
  75.                     .getApplicationInfo(getPackageName(),  
  76.                             PackageManager.GET_META_DATA);  
  77.             String mTag = appInfo.metaData.getString("mTag");  
  78.   
  79.             Log.e(TAG, "mTag=" + mTag);  
  80.   
  81.         } catch (NameNotFoundException e) {  
  82.             e.printStackTrace();  
  83.         }  
  84.     }  
  85.   
  86.     /** 
  87.      * 读取BroadcastReceiver 节点  meta-data 信息 
  88.      */  
  89.     private void readMetaDataFromBroadCast() {  
  90.         try {  
  91.             ComponentName cn = new ComponentName(this, DemoReceiver.class);  
  92.             ActivityInfo info = this.getPackageManager().getReceiverInfo(cn,  
  93.                     PackageManager.GET_META_DATA);  
  94.             String mTag = info.metaData.getString("mTag");  
  95.             Log.e(TAG, "mTag=" + mTag);  
  96.         } catch (NameNotFoundException e) {  
  97.             e.printStackTrace();  
  98.         }  
  99.     }  
  100.       
  101.     /** 
  102.      * 读取Service 节点  meta-data 信息 
  103.      */  
  104.     private void readMetaDataFromService() {  
  105.         try {  
  106.             ComponentName cn = new ComponentName(this, DemoService.class);  
  107.             ServiceInfo info = this.getPackageManager().getServiceInfo(cn,  
  108.                     PackageManager.GET_META_DATA);  
  109.             String mTag = info.metaData.getString("mTag");  
  110.             Log.e(TAG, "mTag=" + mTag);  
  111.         } catch (NameNotFoundException e) {  
  112.             e.printStackTrace();  
  113.         }  
  114.     }  
  115.   
  116.     /** 
  117.      * 读取Activity 节点  meta-data 信息 
  118.      */  
  119.     private void readMetaDataFromActivity() {  
  120.         ActivityInfo info;  
  121.         try {  
  122.             info = this.getPackageManager().getActivityInfo(getComponentName(),  
  123.                     PackageManager.GET_META_DATA);  
  124.             String mTag = info.metaData.getString("mTag");  
  125.             Log.e(TAG, "mTag=" + mTag);  
  126.               
  127.             //读取图片资源id  
  128.             int mResource = info.metaData.getInt("mResource");  
  129.               
  130.             iv_pic.setImageResource(mResource);  
  131.               
  132.         } catch (NameNotFoundException e) {  
  133.             e.printStackTrace();  
  134.         }  
  135.   
  136.     }  
  137.   
  138. }  


0 0
原创粉丝点击