android - studio - ¿Cómo utilizar una actividad de lanzador diferente en un sabor de producto?
configure gradle android studio (6)
Crea un archivo diferente de AndroidManifest.xml en tu estilo. Y establece tu DifferentFlavorMainActivity.java como la actividad del iniciador con nombre completo como:
android:name="com.android.application.paid.MainActivity"
Estoy trabajando en un proyecto de biblioteca de Android, en el src / main / AndroidManifest.xml predeterminado, MainActivity es la actividad del iniciador.
Por el bien de otra cosa, creé sabores de productos. Sí, funciona perfectamente si quiero activar / mostrar diferentes activitis dentro de diferentes sabores de productos. Sin embargo, quiero mantener la actividad predeterminada del iniciador de la carpeta src / main / , mientras que registrar otra actividad con sabor como la nueva actividad del iniciador. De modo que para diferentes sabores de producto, podría tener diferentes actividades de iniciador, y desde ellos aún podría comenzar la actividad original de "iniciador" en src / main /.
¿Podría alguien amablemente decirme cómo lograr eso? Muchas gracias.
Notas:
No se
if (BuildConfig.FLAVOR.equals("flavorName"))
códigoif (BuildConfig.FLAVOR.equals("flavorName"))
a la actividad delif (BuildConfig.FLAVOR.equals("flavorName"))
original. Porque no quiero modificar el código de producción de otra persona (este es un proyecto de biblioteca).He intentado
manifestmerger
ytools:replace
, pero parece que no funciona paraintent-filter
deintent-filter
(noté que la política de fusión del elemento para el filtro de intento es siempre).
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
Si esto puede funcionar, ¿podría por favor guiarme amablemente para hacer que funcione? Gracias.
Creo que <activity-alias>
encaja allí más que cualquier otra solución (no tengo idea de por qué @JingLi no pudo hacerlo funcionar. Tal vez hubo algunos problemas hace un año, pero por ahora está bien).
Por ejemplo, tenemos el siguiente manifiesto en main
:
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.application">
<application>
<activity android:name=".InfoActivity"/>
<activity-alias
android:name="com.example.application.Launcher"
android:targetActivity=".InfoActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
</application>
</manifest>
Y queremos reemplazar la actividad del DebugInfoActivity
con DebugInfoActivity
del debug
. Entonces, solo tenemos que reemplazar el atributo targetActivity
en la etiqueta <activity-alias>
especificada:
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name=".DebugInfoActivity"/>
<!-- to not litter the manifest -->
<activity
android:name="com.example.application.InfoActivity"
tools:node="remove"/>
<activity-alias
android:name="com.example.application.Launcher"
android:targetActivity=".DebugInfoActivity"
tools:replace="android:targetActivity"/>
</application>
</manifest>
Notas:
- En el ejemplo usamos el mismo nombre de paquete para
main
ydebug
. - Tenemos que ingresar el nombre completo para el alias de actividad, de modo que la fusión pueda fusionarlos correctamente.
Con la solución también podemos heredar todos los atributos y elementos secundarios del alias de actividad main
para no duplicarlos en la debug
.
La solución más sencilla de trabajo es utilizar la fusión de manifiestos y el uso de
<intent-filter tools:node="removeAll">
Como se sugiere en el siguiente post:
Fusionando archivos de manifiesto de Android, filtro conflictivo
La solución más simple y limpia es mantener solo un Manifest y escribir dos MainActivity.java class one diferentes para cada sabor para evitar la duplicación de nodos manifiestos.
Dados dos sabores en gradle
productFlavors {
paid {
packageName "com.example"
}
demo {
packageName "com.example.demo"
}
}
Dada esta estructura de proyecto
app/
|--libs/
|--src/
|--paid/
| |--java/
| |--com/example/
| |--MainActivity.java
|--demo/
| |--java/
| |--com/example/
| |--MainActivity.java
|--main/
|--java/
| |--...
|--res/
| |--...
|--AndroidManifest.xml
Y este manifiesto de Android.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.flavors">
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
Lo que he intentado:
- Habilitando la fusión manifiesta , que no funciona;
- Usando actividad-alias , que tampoco funciona.
Finalmente, descubrí que el problema podría resolverse simplemente agregando una línea:
<category android:name="android.intent.category.DEFAULT" />
==================================================
Para que quede claro, repasaré el problema y la solución una vez más:
Bajo src/main/java
hay una MainActivity
, y en src/main/AndroidManifest.xml
correspondiente, se especifica MainActivity como la actividad del iniciador:
<activity android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Esa es una parte muy fácil. Ahora comenzamos con la parte de sabor del producto.
Debido a alguna razón, en una versión de producto, no quiero sobrescribir MainActivity, en cambio, tengo una YetAnotherMainActivity
. El objetivo es configurar YetAnotherMainActivity
como la nueva actividad del lanzador en la MainActivity
del producto, y aún debería poder llamar a MainActivity
.
Y aquí es cómo puede configurar la nueva actividad en el sabor del producto como la nueva actividad del iniciador:
flavorX/AndroidManifest.xml
:
<activity android:name="com.example.YetAnotherMainActivity"
android:label="@string/title_yet_another_main_activity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Sí, resulta muy fácil. Simplemente agregue android.intent.category.DEFAULT
.
Supongo que no llego tarde :) Así que hoy tengo el mismo problema. La solución de @seroperson era correcta, pero si no desea en absoluto la actividad del iniciador predeterminada, simplemente use el siguiente código en el manifiesto de su sabor:
<activity
android:name=".DefaultLauncherActivity"
tools:node="remove"
>