用味道替换启动活动

时间:2015-07-22 14:33:55

标签: android gradle android-gradle

是否可以替换获取intent-filter的活动

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

通过配置flavor?

3 个答案:

答案 0 :(得分:10)

感谢manifest merger

,有很多方法可以实现这一目标

最简单的方法是在清单中使用占位符,并在build.gradle中定义适当的类。

例如,在你的清单中:

<activity android:name="${launchActivityName}">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

在你的build.gradle中:

productFlavors {
    flavor1 {
        manifestPlaceholders = [ launchActivityName:"com.example.MainActivity"]
    }
}

您还可以为每种风格添加不同的清单文件。

答案 1 :(得分:4)

是的,只需在产品风味和

的文件夹中添加清单文件即可
  

产品风味的清单合并在主要配置的清单之上。

此处有更多信息:http://tools.android.com/tech-docs/new-build-system/build-system-concepts

答案 2 :(得分:0)

除了@Tanis答案之外,我还想添加一些您应该注意的部分。

productFlavors {
    lite {
        dimension "default"
        applicationId "com.foo.bar"
        manifestPlaceholders = [ applicationLabel:"@string/app_name_foo"
                                 , launcherAct: "com.foo.qux.activity.Hello"
                                 , launcherAct2: "com.foo.qux.activity.World"]
    }
    full {
        dimension "default"
        applicationId "com.foo.qux"
        manifestPlaceholders = [ applicationLabel:"@string/app_name_bar"
                                 , launcherAct: ".activity.World"
                                 , launcherAct2: ".activity.Hello"]
    }
}
  1. 如果说您的World.java位于com.foo.qux.activity文件夹中,则应使用完整路径 com.foo.qux.activity.World而不是.activity.World将其放在applicationId "com.foo.bar"样式中,否则它将自动添加到文件不存在的com.foo.bar.activity.World之前。

  2. android:label不同,您不能在@string/launcher_class中使用诸如 android:name 之类的东西,否则当您获得error: attribute 'android:name' in <activity> tag must be a valid Java class name.时构建。

  3. 确保您不重复该类,例如:

    <activity
        android:name="${launcherAct}"
        android:label="${applicationLabel}">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
    </activity>
    <activity
        android:name="${launcherAct2}"
        android:label="${applicationLabel}">
    </activity>
    

别忘了从.activity.World更改为android:name="${launcherAct2}",否则您将结束重复活动(即AndroidManifest.xml中的一项,{ {1}}。

  1. manifestPlaceholders 红色指示符可以安全地忽略,似乎是Android Studio错误: enter image description here

我做了一个错误报告here