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");