是否可以替换获取intent-filter的活动
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
通过配置flavor?
答案 0 :(得分:10)
最简单的方法是在清单中使用占位符,并在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"]
}
}
如果说您的World.java
位于com.foo.qux.activity
文件夹中,则应使用完整路径 com.foo.qux.activity.World
而不是.activity.World
将其放在applicationId "com.foo.bar"
样式中,否则它将自动添加到文件不存在的com.foo.bar.activity.World
之前。
与android:label
不同,您不能在@string/launcher_class
中使用诸如 android:name
之类的东西,否则当您获得error: attribute 'android:name' in <activity> tag must be a valid Java class name.
时构建。
确保您不重复该类,例如:
<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}}。
我做了一个错误报告here。