如何使用 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/

10-15 11:22