Android清单文件如何通过Flavor Activity替换Activity

7
如何使用manifest命令“replace”来将主包中的活动替换为具有相同名称但在flavor包中的活动?请参考此链接
com.name.project/main/
-ActivityA

替换为

com.name.project/pro/
-ActivityA

我相信这是一个重复的问题,你应该能够在这里找到你的答案:https://dev59.com/bVwY5IYBdhLWcg3wsphj - PedroAGSantos
这仅适用于MainActivity。 - XxGoliathusxX
你能更好地解释一下目的吗?activityA中的代码和主要代码(main)是相同的吗?那么为什么你想要替换呢? - PedroAGSantos
我有两种版本(免费和付费)。付费版本中的活动扩展了主要版本(无版本)中的默认活动,并且还具有一些许可实现,只有付费版本需要。 - XxGoliathusxX
1
那么我会在主要的地方创建一个baseActivityA,然后在免费版本中创建一个ActivityA,在专业版本中创建另一个ActivityA,并且两者都扩展了主要的BaseActivityA。 - PedroAGSantos
1个回答

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>

在声明别名时,如果您的风味具有不同的包名,使用${applicationId}是很重要的。这是因为您使用构建的包名来启动活动别名。
  • 更改启动您的活动的意图,以便使用别名启动它
  • Intent intent = new Intent(); String packageName = context.getPackageName(); ComponentName componentName = new ComponentName(packageName, packageName + ".aliasMain"); intent.setComponent(componentName);

  • 在口味的清单中,声明替代活动,覆盖别名的目标活动指向这个新活动,并删除基本活动声明,这样如果我们尝试启动它将会出错:
  •  <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>
    

    请注意,清单标签中的包名是基本包名"com.company.app",而不是口味的包名"com.company.app.flavor"。我故意这样做是为了避免在清单的其他地方写出完整的包名。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接