一、manifestPlaceholders
我们多渠道打包或者是类似的马甲包的时候,通常会用到Gradle
productFlavors,这样如果不同应用我们可以采用manifestPlaceholders的方式来配置。但是如果我们想要在Activity中等引用这个值,避免手动修改该如何实现呢?
我们先贴出Gradle productFlavors的写法代码:
productFlavors {
//正式
mixin {
applicationId "com.lx.mixin"
dimension "1.1"
manifestPlaceholders = [
AppKey : "key1"]
}
//测试
mixin_t {
applicationId "com.lx.mixin_t"
dimension "1.1"
manifestPlaceholders = [
AppKey : "key2"]
}
}
我们要做的是通过代码自动获取对应的appKey
通过源码,其实就是一个HashMap的对象,我们在build.gradle中写入,然后映射到AndroidMainfest.xml中,HashMap对象放置在activityInfo.metaData中,我们可以通过activityInfo.metaData.keyset()查看所有设置的值
二、取值
1、AndroidMainfest.xml中
我们可以直接使用
<meta-data
android:name="UMENG_APPKEY"
android:value="${AppKey}" />
2、java代码中(Application、Activity、Service等)
这几种取值方式基本相同
Activity
1、先在AndroidMainfest.xml中中的activity标签下声明变量
<activity android:name=".PayTestActivity">
<meta-data android:name="test_key" android:value="${AppKey}"/>
</activity>
2、取值,我们这边封装成方法
/**
* 在Activity获取 manifestPlaceholders 的值
* <p>
* 注意:在AndroidManifest.xml 该Activity标签下加上 <meta-data android:name="label111" android:value="${label}" /><!--这一句起到至关重要作用-->
*
* @param context
* @param key
* @return
*/
public String getActivityPlaceholders(Context context, String key) {
String placeholdersValues = "";
try {
ActivityInfo appInfo = context.getPackageManager().getActivityInfo(((Activity) context).getComponentName(), PackageManager.GET_META_DATA);//Activity中
if (appInfo == null) {
return "";
}
Bundle metaData = appInfo.metaData;
if (metaData == null) {
return "";
}
placeholdersValues = metaData.getString(key);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return placeholdersValues;
}
Application
1、先在AndroidMainfest.xml中的application标签下声明变量
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name">
<meta-data android:name="test_key" android:value="${AppKey}"/>
</application>
2、取值
/**
* 在Application获取 manifestPlaceholders 的值
*
* @param context
* @param key
* @return
*/
public String getApplicationPlaceholders(Context context, String key) {
String placeholdersValues = "";
try {
//services receiver只是改个名字类似 ServiceInfo
ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);//Application中
if (appInfo == null) {
return "";
}
Bundle metaData = appInfo.metaData;
if (metaData == null) {
return "";
}
placeholdersValues = metaData.getString(key);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return placeholdersValues;
}
Service
Service不多赘述
大功告成~