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:
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).
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.
Ce que j'ai essayé
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
.
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:
main
et debug
.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
.
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"
>