如何使用 list 命令"replace"将主包中的 Activity 替换为具有相同名称但在flavor包中的 Activity ?
com.name.project/main/
-ActivityA
替换为
com.name.project/pro/
-ActivityA
最佳答案
为此,您可以为要覆盖的每个 Activity 创建一个 Activity 别名,然后在 flavor list 中覆盖该别名的target_activity。
1)在主 list 中添加 Activity 的别名:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.app">
<application>
<activity
android:name=".MainActivity"
/>
<activity-alias
android:name="${applicationId}.aliasMain"
android:targetActivity=".MainActivity"/>
</application>
</manifest>
如果您的口味具有不同的程序包名称,则在声明别名时使用$ {applicationId}很重要。这是因为您使用生成的程序包名称启动了 Activity 别名。
2)更改启动您的 Activity 的 Intent ,以便它们launch it using the alias:
Intent intent = new Intent();
String packageName = context.getPackageName();
ComponentName componentName = new ComponentName(packageName, packageName + ".aliasMain");
intent.setComponent(componenteduName);
3)在 flavor list 中,声明替换 Activity ,重写别名的目标 Activity 以指向该新 Activity ,并删除基本 Activity 声明以作好准备:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.company.app">
<application>
<activity
android:name=".flavor.MainActivity"/>
<activity-alias
tools:replace="android:targetActivity"
android:name="${applicationId}.aliasMain"
android:targetActivity=".flavor.MainActivity"/>
<activity
tools:node="remove"
android:name=".MainActivity"
/>
</application>
</manifest>
请注意, list 标记中的程序包名称是基本程序包名称“com.company.app”。这意味着我必须在 Activity 声明中包括软件包后缀。我故意这样做是因为它更明确。它还允许我使用node:remove从基本包中删除 Activity 。
关于Android Manifest如何用Flavor Activity替换Activity,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40964388/