tutorial studio productflavors now must flavors flavor configurar belong all actualizar android android-intent android-manifest android-productflavors

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:

  1. No se if (BuildConfig.FLAVOR.equals("flavorName")) código if (BuildConfig.FLAVOR.equals("flavorName")) a la actividad del if (BuildConfig.FLAVOR.equals("flavorName")) original. Porque no quiero modificar el código de producción de otra persona (este es un proyecto de biblioteca).

  2. He intentado manifestmerger y tools:replace , pero parece que no funciona para intent-filter de intent-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 y debug .
  • 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 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:

  1. Habilitando la fusión manifiesta , que no funciona;
  2. 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" >