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