轉(zhuǎn)至:http://blog.csdn.net/tangjiarao/article/details/51996549
獲取渠道號(hào)信息代碼段
ApplicationInfo appInfo = getPackageManager()
.getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
String appkey = appInfo.metaData.getString("UMENG_APPKEY");
最近做一個(gè)項(xiàng)目的要求是開發(fā)一個(gè)app,但是它需要給不同的企業(yè)使用妆艘,還有分管理員和用戶的模式另凌。但是app主要的業(yè)務(wù)功能是大致相同的,不同的只是部分的UI劈榨,APP名字&APP的圖標(biāo),還有獲取后臺(tái)數(shù)據(jù)的接口URL晦嵌。不可能給每個(gè)企業(yè)都重新復(fù)制一份代碼同辣,再慢慢修改,這樣太難了惭载。
所以用到androidstudio的productFlavors實(shí)現(xiàn)這個(gè)功能旱函,通過它來修改每個(gè)版本不同的部分,或者通過判斷當(dāng)前所使用的app是哪個(gè)版本描滔,執(zhí)行對(duì)應(yīng)版本的代碼棒妨。所以如果是使用eclipse的童鞋就默默地關(guān)掉吧。
效果圖:
這里有兩個(gè)app伴挚,名字不一樣靶衍,但是它們是通過一份代碼生成出來的,里面的內(nèi)容也不一樣茎芋。
步驟:
1.app下的build.grade 增加productFlavors
[java]view plaincopy
apply?plugin:'com.android.application'
android?{
...
productFlavors?{
version1?{
applicationId"com.my.version.old"
resValue"string","app_name","版本1"
}
version2?{
applicationId"com.tc.version.new"
resValue"string","app_name","版本2"
}
}
}
version1颅眶、version2分別生成了兩個(gè)渠道,applicationId分別修改了它們的applicationId田弥,resValue分別修改了它們定義在string.xml中的app_name涛酗,所以也會(huì)修改app的應(yīng)用名稱。
AndroidManifest.xml
[java]view plaincopy
package="com.my.myapplication">
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
android:label="@string/app_name">
2.在app/src目錄下新建兩個(gè)文件夾version1偷厦、version2商叹,這兩個(gè)文件夾名字對(duì)應(yīng)build.grade下的渠道名。
在version1只泼、version2目錄下分別新建文件夾Java剖笙,文件夾com.my.version,versionSetting.java類请唱,相當(dāng)于在原先的java目錄上加上包c(diǎn)om.my.version弥咪,里面有versionSetting類。
version1里面versionSetting.java
[java]view plaincopy
packagecom.my.version;
/**
*?Created?by?tangjiarao?on?16/6/23.
*/
publicclassversionSetting?{
publicstaticintversionNum=1;
}
version2里面versionSetting.java
[java]view plaincopy
packagecom.my.version;
/**
*?Created?by?tangjiarao?on?16/6/23.
*/
publicclassversionSetting?{
publicstaticintversionNum=2;
}
至此渠道配置完畢十绑。
MainActivity.java
[java]view plaincopy
packagecom.my.myapplication;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.widget.TextView;
importcom.my.version.versionSetting;
publicclassMainActivityextendsAppCompatActivity?{
privateTextView?test;
@Override
protectedvoidonCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
test=(TextView)findViewById(R.id.test);
if(versionSetting.versionNum==1){
test.setText("這是版本1?APP");
}else{
test.setText("這是版本2?APP");
}
}
}
通過versionSetting獲取versionNum并且判斷其值聚至,執(zhí)行相應(yīng)的代碼。
運(yùn)行app會(huì)發(fā)現(xiàn)報(bào)錯(cuò):
需要把string.xml中的app_name去掉
[java]view plaincopy
重新運(yùn)行app就會(huì)生成version1渠道對(duì)應(yīng)的app本橙,通過下圖操作可以切換其他渠道app扳躬,再次運(yùn)行就能生成version2渠道對(duì)應(yīng)的app。并且可以做output文件夾中看到生成的apk。
3.修改不同渠道下app的圖標(biāo)贷币。先在app/drawable下加入圖片击胜。
將res/drawable文件夾復(fù)制到以下目錄,但是logo圖片要替換成其他圖片片择,因?yàn)橐吹絻蓚€(gè)app icon不一樣潜的。
將AndroidManifest.xml中的icon修改成logo
[java]view plaincopy
package="com.my.myapplication">
android:allowBackup="true"
android:icon="@drawable/logo"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
android:label="@string/app_name">
此時(shí)運(yùn)行version2 app并沒有改變圖標(biāo)骚揍,因?yàn)樗膔es文件夾并沒有覆蓋到原來的內(nèi)容字管。要在build.grade下增加一下代碼。
[java]view plaincopy
apply?plugin:'com.android.application'
android?{
...
productFlavors?{
version1?{
applicationId"com.my.version.old"
resValue"string","app_name","版本1"
}
version2?{
applicationId"com.tc.version.new"
resValue"string","app_name","版本2"
}
}
sourceSets?{
main?{
manifest.srcFile'src/main/AndroidManifest.xml'
java.srcDirs?=?['src/main/java']
resources.srcDirs?=?['src/main/java']
aidl.srcDirs?=?['src/main/java']
renderscript.srcDirs?=?['src/main/java']
res.srcDirs?=?['src/main/res']
assets.srcDirs?=?['src/main/assets']
jniLibs.srcDirs?=?['libs']
}
version2.java.srcDirs?=?['src/version2/java']
version2.res.srcDirs?=?['src/version2/res']
}
}
重新運(yùn)行app1信不、app2嘲叔,得到以下效果。
參考文章:
http://www.tuicool.com/articles/2YJniav
http://blog.csdn.net/tiankong1206/article/details/50436007
http://blog.csdn.net/maosidiaoxian/article/details/42000913