My Profile Photo

Kris Lee


专注移动互联,提供移动开发、培训与解决方案


获取Manifest中标签的值

在平时我们开发应用的过程中,我们可能需要设置一些动态变量值随着我们版本的变化一起变化 。在这种情况下,一般我们首先想到的办法可能就是我们申明一个静态的变量,然后在我们的应用中直接使用就行了,以后如果需要修改的时候,我们再找到这个类里面的定义的地方,再重新赋值即可。。。

当然,我们也可以通过在Menifest里面的meta-data标签来定义一个值,然后在我们的应用中直接去读取即可,这样,下次如果需要修改值,我们就不必再找到我们的代码了,而是在修改我们的版本号的时候,一起就可以修改了。更加方便与便捷。

这样的应用场景在给多市场打包的时候,你一定见过。比如友盟,有米的sdk里面就有一步为:在 application标签下定义一个meta-data来为不同的市场赋值和传入不同的appId。

那么我们的自己应用里面应该如何去定义meta-data的值呢?并且怎么在代码中取出我们要想的值 呢?

那么点击更多,跟着我一起来看看如何操作吧!!! 形如:

   <application ...>
       
       <activity ...>
              
       </activity>
   </application>

从上面可以看出,我们的meta-data不仅仅是可以放到application标签下面,也可以放到activity下面,其实也可以放到service ,receiver下面。。。

我们分别来看看如何获取的吧?

1.获取 application标签中的meta-data: 形如:

   
       
   </application>
</pre>
代码:
    ApplicationInfo appInfo = context.getPackageManager()
                                  .getApplicationInfo(context.getPackageName(),
                          PackageManager.GET_META_DATA);
    String dataName=appInfo.metaData.getString("data_Name");
2.获取 activity标签中的meta-data: 形如:
   <activity ...>
       
   </activity>
代码:
    ActivityInfo activityInfo = context.getPackageManager()
                                  . getActivityInfo(activity.getComponentName(),
                          PackageManager.GET_META_DATA);
    String dataName=activityInfo.metaData.getString("data_Name");
注意:activity.getComponentName()为获取activity实例的ComponentName 也可以用下面的代替:
//通过指定一个activity类来生成一个新的ComponentName
ComponentName componentName =new ComponentName(context, SplashActivity.class);
3.获取 service标签中的meta-data: 形如:
   < service ...>
       
   </service >
代码:
    ComponentName componentName=new ComponentName(context, MyService.class);
    ServiceInfo serviceInfo = context.getPackageManager()
                                  . getServiceInfo(componentName,
                          PackageManager.GET_META_DATA);
    String dataName=serviceInfo.metaData.getString("data_Name");
注意:在Service里面就没有getComponentName()方法来快速获取到当前的ComponentName了,所以只能通过指定service类的方式来生成一个新的ComponentName 4.获取 receiver标签中的meta-data: 形如:
   < receiver ...>
       
   </receiver >
代码:
    ComponentName componentName=new ComponentName(context, MyService.class);
    ActivityInfo activityInfo = context.getPackageManager()
                                  . getReceiverInfo(componentName,
                          PackageManager.GET_META_DATA);
    String dataName=activityInfo.metaData.getString("data_Name");
注意:在receiver可没有 ReceiverInfo了,而是用的activityInfo来处理的。 最后的注意:我们在获取值的时候都是使用的是:xxxInfo.metaData.getString("data_Name");把所有的值都当成是String来获取的,如果在meta-data中是int型的,如果还是使用getString()方法获取出来的值是为空的,但是metaData提供了这么多种get方法来获取 。 如果metadata 的数据类型是没办法确定的,那么可以直接使用 Object object = metaData.get(key)来获取 ,然后再转化成自己要想的数据类型。