主页 > 软件开发  > 

Android动态加入Activity时manifest注册报错解决。使用manifestPlaceholder

Android动态加入Activity时manifest注册报错解决。使用manifestPlaceholder

需求如下:

项目 测试demo 有多个渠道,部分渠道包含支付功能,在主测试代码外,需要一个单独 Activity 调用测试代码。

MainActivityPayActivity渠道A包含不包含渠道B包含包含

因为支付功能需要引入对应的 moudule,因此希望是测试渠道A时,仅包含MainAcitivity 的代码。测试渠道B时,包含 MainAcitivity + PayActivity 的代码。

代码引入简单,添加 java 路径即可。

qudaob{ // 加入支付相关代码 sourceSets."$name".java.srcDirs += "src/main/code/pay" }

问题是 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("功能未启用"); }

标签:

Android动态加入Activity时manifest注册报错解决。使用manifestPlaceholder由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Android动态加入Activity时manifest注册报错解决。使用manifestPlaceholder