Android Manifest如何通过Flavor Activity替换Activity

时间:2016-12-04 22:20:12

标签: android merge manifest android-productflavors

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

com.name.project/main/
-ActivityA

替换为

com.name.project/pro/
-ActivityA

1 个答案:

答案 0 :(得分:1)

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

1)将活动的别名添加到主清单:

<div class="example example-cover">
  <img src="https://i.stack.imgur.com/B0EAo.png">
  <img src="https://i.stack.imgur.com/iYkNH.png">
  <img src="https://i.stack.imgur.com/gne9N.png">
</div>

<div class="example example-contain">
  <img src="https://i.stack.imgur.com/B0EAo.png">
  <img src="https://i.stack.imgur.com/iYkNH.png">
  <img src="https://i.stack.imgur.com/gne9N.png">
</div>

如果你的口味有不同的包名,那么在声明别名时使用$ {applicationId}很重要。这是因为您使用构建的包名称启动了活动别名。

2)更改启动您的活动的意图,使其launch it using the alias

<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>

3)在flavor的清单中,声明替换活动,覆盖别名的目标活动以指向此新活动,并删除基本活动声明以获得良好的衡量标准:

Intent intent = new Intent();
String packageName = context.getPackageName();
ComponentName componentName = new ComponentName(packageName, packageName + ".aliasMain");
intent.setComponent(componenteduName);

请注意,清单标记中的包名称是基本包名称&#34; com.company.app&#34;。这意味着我必须在活动声明中包含包后缀。我故意这样做,因为它更明确。它还允许我使用节点:删除基础包中的活动。