獲取AndroidManifest.xml中元素

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");
發佈了29 篇原創文章 · 獲贊 2 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章