Android Manifest如何通过Flavor Activity替换Activity

XxG*_*sxX 5 merge android manifest android-productflavors

如何使用manifest命令"replace"通过具有相同名称但在flavor包中的活动替换主包中的活动?

com.name.project/main/
-ActivityA
Run Code Online (Sandbox Code Playgroud)

替换为

com.name.project/pro/
-ActivityA
Run Code Online (Sandbox Code Playgroud)

Rob*_*ore 4

您可以通过为要覆盖的每个活动创建一个活动别名,然后在风味清单中覆盖别名的 target_activity 来实现此目的。

  1. 将您的活动的别名添加到主清单中:
<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>
Run Code Online (Sandbox Code Playgroud)

如果您的风格具有不同的包名称,则在声明别名时使用 ${applicationId} 非常重要。这是因为您使用构建的包名称启动活动别名。

  1. 更改启动您的活动的意图,以便他们使用别名启动它

    意图intent = new Intent(); String packageName = context.getPackageName(); ComponentName 组件名称 = new ComponentName(packageName, packageName + ".aliasMain"); Intent.setComponent(组件名称);

  2. 在风味的清单中,声明替换活动,覆盖别名的目标活动以指向这个新活动,并删除基本活动声明,这样如果我们尝试启动它就会出错:

     <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>
    
    Run Code Online (Sandbox Code Playgroud)

请注意,清单标记中的包名称是基本包名称“com.company.app”,而不是风味包“com.company.app.flavor”。我是故意这样做的,这样我就不必在清单中的其他地方写出整个包名称。