android 获取application和activity下meta-data中的值

简介:

        meta-data在AndroidManifest中是以键值对的形式存在的,可以将meta-data放在application根节点下,也可以放在某个activity节点下。因为存放的位置不同,因此获取value时也要使用对应的方法,下面是我写的一个小测试。

代码如下:

先是在AndroidManifest中的application和mainActivity下添加两个meta-data属性。

[java]  view plain copy
  1. <application  
  2.     android:allowBackup="true"  
  3.     android:icon="@drawable/ic_launcher"  
  4.     android:label="@string/app_name"  
  5.     android:theme="@style/AppTheme" >  
  6.     <meta-data  
  7.         android:name="com.lzy.test"  
  8.         android:value="测试" />  
  9.   
  10.     <activity  
  11.         android:name=".MainActivity"  
  12.         android:label="@string/app_name" >  
  13.         <meta-data  
  14.             android:name="com.example.metatest.MainActivity.com.lzy.activity.test"  
  15.             android:value="Activity测试" />  
  16.   
  17.         <intent-filter>  
  18.             <action android:name="android.intent.action.MAIN" />  
  19.   
  20.             <category android:name="android.intent.category.LAUNCHER" />  
  21.         </intent-filter>  
  22.     </activity>  
  23. </application>  

接下来在mainActivity中来获取这两个属性的值。

[java]  view plain copy
  1. package com.example.metatest;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ComponentName;  
  5. import android.content.pm.ActivityInfo;  
  6. import android.content.pm.ApplicationInfo;  
  7. import android.content.pm.PackageManager;  
  8. import android.content.pm.PackageManager.NameNotFoundException;  
  9. import android.os.Bundle;  
  10. import android.util.Log;  
  11. import android.widget.Toast;  
  12.   
  13. /** 
  14.  * meta 测试 
  15.  *  
  16.  * @author Administrator 
  17.  *  
  18.  */  
  19.   
  20. public class MainActivity extends Activity {  
  21.   
  22.     public static final String TEST = "com.lzy.test";  
  23.   
  24.     public static final String ACTIVITYTEST = MainActivity.class.getName()+".com.lzy.activity.test";  
  25.   
  26.     @Override  
  27.     protected void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.activity_main);  
  30.           
  31.         String test = getMetaDataStringApplication(TEST, null);  
  32.           
  33.         String activityTest = getMetaDataStringFromActivity(ACTIVITYTEST, null);  
  34.           
  35.         Toast.makeText(this, test+"--"+activityTest, Toast.LENGTH_LONG).show();  
  36.     }  
  37.       
  38.     /** 
  39.      * 根据key从Application中返回的Bundle中获取value 
  40.      *  
  41.      * @param key 
  42.      * @param defValue 
  43.      * @return 
  44.      */  
  45.     private String getMetaDataStringApplication(String key, String defValue) {  
  46.         Bundle bundle = getAppMetaDataBundle(getPackageManager(), getPackageName());  
  47.         if (bundle != null && bundle.containsKey(key)) {  
  48.             return bundle.getString(key);  
  49.         }  
  50.         return defValue;  
  51.     }  
  52.       
  53.     /** 
  54.      * 获取Application中的meta-data. 
  55.      *  
  56.      * @param packageManager 
  57.      * @param packageName 
  58.      * @return 
  59.      */  
  60.     private Bundle getAppMetaDataBundle(PackageManager packageManager,  
  61.             String packageName) {  
  62.         Bundle bundle = null;  
  63.         try {  
  64.             ApplicationInfo ai = packageManager.getApplicationInfo(packageName,  
  65.                     PackageManager.GET_META_DATA);  
  66.             bundle = ai.metaData;  
  67.         } catch (NameNotFoundException e) {  
  68.             Log.e("getMetaDataBundle", e.getMessage(), e);  
  69.         }  
  70.         return bundle;  
  71.     }  
  72.       
  73.     /** 
  74.      * 根据key从Activity中返回的Bundle中获取value 
  75.      *  
  76.      * @param key 
  77.      * @param defValue 
  78.      * @return 
  79.      */  
  80.     private String getMetaDataStringFromActivity(String key, String defValue) {  
  81.         Bundle bundle = getActivityMetaDataBundle(getPackageManager(), getComponentName());  
  82.         if (bundle != null && bundle.containsKey(key)) {  
  83.             return bundle.getString(key);  
  84.         }  
  85.         return defValue;  
  86.     }  
  87.       
  88.     /** 
  89.      * 获取Activity中的meta-data. 
  90.      *  
  91.      * @param packageManager 
  92.      * @param component 
  93.      * @return 
  94.      */  
  95.     private Bundle getActivityMetaDataBundle(PackageManager packageManager, ComponentName component) {  
  96.         Bundle bundle = null;  
  97.         try {  
  98.             ActivityInfo ai = packageManager.getActivityInfo(component,  
  99.                     PackageManager.GET_META_DATA);  
  100.             bundle = ai.metaData;  
  101.         } catch (NameNotFoundException e) {  
  102.             Log.e("getMetaDataBundle", e.getMessage(), e);  
  103.         }  
  104.   
  105.         return bundle;  
  106.     }  
  107.   
  108. }  

源码下载
相关文章
|
Android开发
Android面试题之Activity的启动模式和flag
Android Activity的四种启动模式:standard(默认,每次启动创建新实例),singleTop(栈顶复用,不走onCreate,调用onNewIntent),singleTask(栈内唯一,清除上方Activity)和singleInstance(单独栈内唯一)。启动模式在AndroidManifest.xml中配置,Intent Flags如FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP可实现类似功能。了解这些对于处理Activity栈管理至关重要。
241 0
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
257 6
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
251 3
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
236 3
|
XML Android开发 数据格式
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
本文通过案例分析了在Android中当两个Activity都设置了`android.intent.category.LAUNCHER`类别时,会导致它们同时在应用启动器的"所有应用"页面显示为不同的启动入口。
422 2
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
讲解Activity的启动流程了,Activity的启动流程相对复杂一下,涉及到了Activity中的生命周期方法,涉及到了Android体系的CS模式,涉及到了Android中进程通讯Binder机制等等, 首先介绍一下Activity,这里引用一下Android guide中对Activity的介绍:
303 4
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
149 0
|
XML Android开发 数据格式
Android 中如何设置activity的启动动画,让它像dialog一样从底部往上出来
在 Android 中实现 Activity 的对话框式过渡动画:从底部滑入与从顶部滑出。需定义两个 XML 动画文件 `activity_slide_in.xml` 和 `activity_slide_out.xml`,分别控制 Activity 的进入与退出动画。使用 `overridePendingTransition` 方法在启动 (`startActivity`) 或结束 (`finish`) Activity 时应用这些动画。为了使前 Activity 保持静止,可定义 `no_animation.xml` 并在启动新 Activity 时仅设置新 Activity 的进入动画。
664 12
|
开发工具 Android开发
解决Manifest merger failed : android:exported needs to be explicitly specified for <activity>
解决Manifest merger failed : android:exported needs to be explicitly specified for <activity>
614 1
|
Android开发 开发者
Android面试之Activity启动流程简述
每个Android开发者都熟悉的Activity,但你是否了解它的启动流程呢?本文将带你深入了解。启动流程涉及四个关键角色:Launcher进程、SystemServer的AMS、应用程序的ActivityThread及Zygote进程。核心在于AMS与ActivityThread间的通信。文章详细解析了从Launcher启动Activity的过程,包括通过AIDL获取AMS、Zygote进程启动以及ActivityThread与AMS的通信机制。接着介绍了如何创建Application及Activity的具体步骤。整体流程清晰明了,帮助你更深入理解Activity的工作原理。
362 0