需求如下:
項目 測試demo 有多個渠道,部分渠道包含支付功能,在主測試代碼外,需要一個單獨 Activity 調用測試代碼。
MainActivity | PayActivity | |
渠道A | 包含 | 不包含 |
渠道B | 包含 | 包含 |
因為支付功能需要引入對應的 moudule,因此希望是測試渠道A時,僅包含MainAcitivity 的代碼。測試渠道B時,包含?MainAcitivity +?PayActivity 的代碼。
代碼引入簡單,添加 java 路徑即可。
qudaob{// 加入支付相關代碼sourceSets."$name".java.srcDirs += "src/main/code/pay/java"sourceSets."$name".res.srcDirs += "src/main/code/pay/res"
}
問題是?PayActivity 的注冊。如果直接在?AndroidManifest.xml 中注冊,那么不包含?PayActivity 時會報錯。如果不注冊,那么包含?PayActivity 時無法跳轉。
前期考慮在 quandaob 文件夾下添加一個AndroidManifest.xml ,讓兩個 Mainifest 合并,但是一直合并不了,只能另辟蹊徑。
使用?manifestPlaceholders
你可以在 build.gradle
文件中為你的 Activity 添加 manifest placeholders,然后在 AndroidManifest.xml
中引用它們。
修改?build.gradle
在 zebra
block 中添加如下代碼:
android {...defaultConfig {...manifestPlaceholders = [payActivity: "com.xxx.test_playcontrol.PayActivity" // 替換為你的 Activity 完整包名]}
}
更新?AndroidManifest.xml
在 AndroidManifest.xml
中,你可以使用占位符來聲明 Activity:
<activity android:name="${payActivity}"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>
這樣在??Manifest中雖然會報紅,但是編譯是沒問題的。Manifest 中會一直包含PayActivity. 這樣無論是否有 PayActivity 都可以正常使用了
動態引用 PayActivity
try {Class<?> dynamicClass = Class.forName("com.xxx.test_playcontrol.PayActivity");Intent intent = new Intent(this, dynamicClass);startActivity(intent);} catch (ClassNotFoundException e) {e.printStackTrace();ToastTools.quickToast(mContext, "pay Failed!");DemoLog.e("功能未啟用");}