AndroidManifest.xml中的meta-data标签、gradle中的manifestPlaceholder的应用

3,108 阅读2分钟

一、manifest中的元数据标签

在Android中环可以在manifest设置元信息meta-data为四大组件配置元信息,然后通过Java代码读取的来使用。

语法格式

<meta-data android:name="string"
           android:resource="resource specification"
           android:value="string" />

1.Activity标签中:

<activity...>
      <meta-data android:name="sex" android:value="man"></meta-data>
</activity>

在代码中动态获取:

ActivityInfo info=this.getPackageManager().getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
String msg =info.metaData.getString("sex");

2.application标签中:

<application...>
      <meta-data android:name="sex" android:value="man"></meta-data>
   </application>

在代码中动态获取:

ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
String msg=appInfo.metaData.getString("sex");

3.在service标签中:

<service android:name="MetaDataService">
           <meta-data android:name="sex" android:value="man"></meta-data>
</service>

在代码中获取:

ComponentName cn=new ComponentName(this, MetaDataService.class);
ServiceInfo info=this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
String msg=info.metaData.getString("sex");

4.在receive标签中:

<receiver android:name="MetaDataReceiver">
            <meta-data android:name="sex" android:value="man"></meta-data>
            <intent-filter>
               <action android:name="android.intent.action.PHONE_STATE"></action>
            </intent-filter>
</receiver>

在代码中获取:

ComponentName cn=new ComponentName(context, MetaDataReceiver.class);
ActivityInfo info=context.getPackageManager()
                             .getReceiverInfo(cn, PackageManager.GET_META_DATA);
String msg=info.metaData.getString("sex");

#二、AndroidGradle为我们提供了非常便捷的方式让我们来替换AndroidManifest文件中的内容,他就是manifestPlacholder、Manifest占位符。

ManifestPlaceholders 是 ProductFlavor 的一个属性,ProductFlavorsandroid的一个属性,可以再android闭包中配置,ProductFlavors同时又是ProductFlavor的一个容器,可以在ProductFlavors的闭包参数中配置任意个ProductFlavor

apply plugin: 'command.android.application'
android {
    compileSdkVersion 28
    defaultConfig {...}
    buildTypes {...}
    flavorDimensions "api"
    productFlavors {
        xiaomi {
            dimension "api"
            manifestPlaceholders.put("sex","男")
        }
        huawei {
            dimension "api"
            applicationIdSuffix ".demo"
            manifestPlaceholders.put("sex","女")
        }
        full {
            dimension "api"
            applicationIdSuffix ".full"
            versionNameSuffix "-full"
        }
        tetd {
            dimension "api"
        }
    }
}

dependencies {...}

#三、AndroirdManifest.xmlgradlejava代码三者结合,针对appliation中的meta-data举例 1.在AndroirdManifest.xml中的application节点中添加

<application...>
      <meta-data android:name="sex" android:value="$sexValue"></meta-data>
</application>

2.在profuctFlavor中设置占位符的值。比如小米版本的设置为,华为版本的设置为

 productFlavors {
        xiaomi {
            dimension "api"
            manifestPlaceholders.put("sexValue","男")
        }
        huawei {
            dimension "api"
            applicationIdSuffix ".demo"
            manifestPlaceholders.put("sexValue","女")
        }
    }

3.在Java代码中

ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
String msg=appInfo.metaData.getString("sex");

这样取值因版本而已,比如小米版本取出来的值就是,华为版本取出来的就是。 #四、实际案例 参考有梦多渠道打包