获取AndroidManifest.xml中<meta-data>元素

meta-data

我们在进行使用推送和统计第三方插件开发中,常见在AndroidManifest.xml中通过来保存一些固定的配置信息或者是key值。
通过来保存一些定值,可以集中在AndroidManifest.xml中管理这些。ActivieAnroid里面的数据库版本号也是通过来设置。
meta-data示例如下:

<meta-data android:name="test" android:value="test String" />

代码中获取meta-data中的信息

通过查找android源代码我们可以找到在类android.content.pm.PackageItemInfo中有一个类型为Bundle的公共属性metaData。这个类的子类有我们比较熟悉的ActivityInfo,ServiceInfo,ApplicationInfo....。所以获取的方法也就十分明显了。
下面是我写的一个帮助类。需要特殊说明的一点是,只有Context的子类才能获取到PackageManager,进而获取到对应的Info类。在使用BroadCastReceiver中,我们一般在它的public void onReceive(Context context, Intent intent)方法中处理数据,这里也提供了Context,所以完全可以获取到<meta-data>。获取到这个Bundle类型的metaData之后我们就可以通过getString(),getInt(),getBoolean()..方法来获取值。

注意如果要通过某个Activity读取meta-data,则该meta-data需要添加在AndroidManifest.xml中该Activity节点下。其他情况同样。

/**
 * Meta
 * AUTHOR:mislead 
 * DESC:
 **/
public class MetaDataUtil {

    private static String TAG = "MetaDataUtil ";
    private static Bundle bundle;

    public static Bundle getMetaDataInActivity(Activity activity) throws PackageManager.NameNotFoundException {
        ActivityInfo info = activity.getPackageManager()
                .getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA);

        return info.metaData;
    }

    public static Bundle getMetaDataInApplication(Application application) throws PackageManager.NameNotFoundException {
        ApplicationInfo info = application.getPackageManager()
                .getApplicationInfo(application.getPackageName(), PackageManager.GET_META_DATA);

        return info.metaData;
    }

    public static Bundle getMetaDataInService(Service service, Class<? extends Service> serviceClass)
            throws PackageManager.NameNotFoundException {
        ComponentName componentName = new ComponentName(service, serviceClass);

        ServiceInfo info = service.getPackageManager().getServiceInfo(componentName, PackageManager.GET_META_DATA);

        return info.metaData;
    }

    /**
     * get meta data in a broadcast receiver
     * only Context{@link Context} can get a packageManager, so you need to provide it.
     * In BroadCastReceiver{@link BroadcastReceiver}, you can get the context of the receiver in onReceive() method
     * @param context
     * @param receiverClass
     * @return
     * @throws PackageManager.NameNotFoundException
     */
    public static Bundle getMetaDataInReceiver(Context context,
                                               Class<? extends BroadcastReceiver> receiverClass)
            throws PackageManager.NameNotFoundException {
        ComponentName componentName = new ComponentName(context, receiverClass);

        ActivityInfo info = context.getPackageManager().getReceiverInfo(componentName, PackageManager.GET_META_DATA);

        return info.metaData;
    }
}
//在Activity应用<meta-data>元素。
    ActivityInfo info = this.getPackageManager()
            .getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
    info.metaData.getString("meta_name");

    //在application应用<meta-data>元素。
    ApplicationInfo appInfo = this.getPackageManager()
            .getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
    appInfo.metaData.getString("meta_name");

    //在service应用<meta-data>元素。
    ComponentName cn = new ComponentName(this, MetaDataService.class);
    ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
    info.metaData.getString("meta_name");

    //在receiver应用<meta-data>元素。
    ComponentName cn = new ComponentName(context, MetaDataReceiver.class);
    ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
    info.metaData.getString("meta_name");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值