web-dev-qa-db-fra.com

Comment utiliser une activité de lanceur différente dans une saveur de produit?

Je travaille sur un projet de bibliothèque Android, dans le fichier par défaut src/main/AndroidManifest.xml, MainActivity est l'activité de lancement.

Par souci d'autre chose, j'ai créé des saveurs de produits. Oui, cela fonctionne parfaitement si je veux déclencher/afficher différentes activites dans différents arômes de produits. Cependant, je veux conserver le dossier Activité du lanceur par défaut from src/main/, tout en enregistrant une autre activité aromatisée en tant que nouvelle activité du lanceur. Ainsi, pour différentes saveurs de produits, je pourrais avoir différentes activités de lanceur et, à partir d’eux, je pourrais toujours commencer l’activité "lanceur" originale dans src/main /.

Quelqu'un pourrait-il bien vouloir me dire comment y parvenir? Merci beaucoup.

Remarques:

  1. L'ajout de code if (BuildConfig.FLAVOR.equals("flavorName")) à l'activité du lanceur d'origine n'est pas préférable. Parce que je ne veux pas modifier le code de production de quelqu'un d'autre (c'est un projet de bibliothèque).

  2. J'ai essayé manifestmerger et tools:replace, mais il semble que cela ne fonctionne pas pour intent-filter (j'ai remarqué que la stratégie de fusion d'éléments pour le filtre d'intention est toujours).

<action Android:name="Android.intent.action.MAIN" /> <category Android:name="Android.intent.category.LAUNCHER" />

Si cela peut fonctionner, pourriez-vous s'il vous plaît bien me guider comment le faire fonctionner? Merci.

20
Jing Li

Ce que j'ai essayé

  1. Enabling Manifest Merger , qui ne fonctionne pas;
  2. Utilisation de activity-alias , qui ne fonctionne pas non plus.

Finalement, j'ai découvert que le problème pouvait être résolu en ajoutant une seule ligne:

<category Android:name="Android.intent.category.DEFAULT" />

===============================================

Pour que ce soit clair, je vais passer en revue le problème et la solution une fois de plus:

Sous src/main/Java, il y a une MainActivity et dans src/main/AndroidManifest.xml correspondant, il spécifie MainActivity comme activité de lancement:

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

C'est une partie très facile. Nous commençons maintenant par la partie saveur du produit.

Pour une raison quelconque, dans une version de produit, je ne veux pas écraser MainActivity, au lieu de cela, j'ai une YetAnotherMainActivity. L’objectif est de définir la YetAnotherMainActivity comme nouvelle activité de lancement dans la version du produit, et il devrait toujours pouvoir appeler MainActivity.

Et voici comment définir la nouvelle activité de la saveur de produit en tant que nouvelle activité de lancement:

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>

Oui, cela s'avère extrêmement facile. Ajoutez simplement Android.intent.category.DEFAULT.

27
Jing Li

Je pense que <activity-alias> y correspond plus que toute autre solution (je ne sais pas pourquoi @JingLi n'a pas pu le faire fonctionner. Peut-être qu'il y a eu des problèmes il y a un an, mais pour l'instant ça va.

Par exemple, nous avons le manifeste suivant dans 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>

Et nous voulons remplacer l'activité de lancement par DebugInfoActivity à partir de debug saveur. Nous devons donc simplement remplacer l'attribut targetActivity dans la balise <activity-alias> spécifiée:

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

Remarques: 

  • Dans l'exemple, nous utilisons le même nom de package pour main et debug.
  • Nous devons entrer le nom complet de activity-alias afin que la fusion puisse les fusionner correctement.

Avec la solution, nous pouvons également hériter de tous les attributs et enfants de main activity-alias afin de ne pas dupliquer leur in debug.

5
seroperson

Je suppose que je ne suis pas en retard:) Donc aujourd'hui, j'ai le même problème. La solution @seroperson était correcte, mais si vous ne souhaitez pas du tout l'activité de lancement par défaut, utilisez simplement le code ci-dessous dans le manifeste de votre version:

<activity
        Android:name=".DefaultLauncherActivity"
        tools:node="remove"
        >
0
nitesh goel