J'ai rencontré un bug dans mon application lors de son lancement à l'aide du bouton «Ouvrir» de l'application Google Play Store (anciennement appelée Android Market). Il semble que son lancement à partir du Play Store utilise une méthode différente Intent
de celle du menu d'icônes du téléphone. Cela conduit au lancement de plusieurs copies de la même activité, qui sont en conflit les unes avec les autres.
Par exemple, si mon application se compose de l'ABC des activités, ce problème peut conduire à une pile d'ABCA.
J'ai essayé d'utiliser android:launchMode="singleTask"
toutes les activités pour résoudre ce problème, mais cela a pour effet secondaire indésirable d'effacer la pile d'activités à la racine, chaque fois que je clique sur le bouton HOME.
Le comportement attendu est: ABC -> HOME -> Et quand l'application est restaurée, j'ai besoin de: ABC -> HOME -> ABC
Existe-t-il un bon moyen d'empêcher le lancement de plusieurs activités du même type, sans réinitialiser l'activité racine lors de l'utilisation du bouton ACCUEIL?
la source
Réponses:
Ajoutez ceci à onCreate et vous devriez être prêt à partir:
la source
finish()
l'utilisateur verra l'activité qui se trouvait en dessous. Pour cette raison, vous pouvez supposer en toute sécurité que l'instance existante de l'application sera mise au premier plan. Si ce n'était pas le cas, vous auriez plusieurs instances de l'application dans des tâches distinctes et l'activité en cours de création serait la racine de sa tâche.Je vais juste expliquer pourquoi cela échoue et comment reproduire ce bogue par programme afin que vous puissiez l'incorporer dans votre suite de tests:
Lorsque vous lancez une application via Eclipse ou Market App, elle se lance avec les indicateurs d'intention: FLAG_ACTIVITY_NEW_TASK.
Lors du lancement via le lanceur (home), il utilise les indicateurs: FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_BROUGHT_TO_FRONT | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED, et utilise l'action " MAIN " et la catégorie " LAUNCHER ".
Si vous souhaitez reproduire ceci dans un cas de test, procédez comme suit:
Ensuite, faites tout ce qui est nécessaire pour accéder à l'autre activité. Pour mes besoins, je viens de placer un bouton qui démarre une autre activité. Revenez ensuite au lanceur (accueil) avec:
Et simulez son lancement via le lanceur avec ceci:
Si vous n'avez pas incorporé la solution de contournement isTaskRoot (), cela reproduira le problème. Nous utilisons cela dans nos tests automatiques pour nous assurer que ce bogue ne se reproduira plus.
J'espère que cela t'aides!
la source
Avez-vous essayé le mode de lancement singleTop ?
Voici une partie de la description de http://developer.android.com/guide/topics/manifest/activity-element.html :
la source
C'est peut-être ce problème ? Ou une autre forme du même bug?
la source
Je pense que la réponse acceptée ( Duane Homick ) a des cas non traités :
Vous avez différents extras (et des doublons d'application en conséquence):
Voici une solution (SDK_INT> = 11 pour les notifications) que je crois gérer ces cas et les notifications de la barre d'état également.
Manifeste :
Activité du lanceur :
Service :
Notification :
la source
Je me rends compte que la question n'a rien à voir avec Xamarin Android mais je voulais publier quelque chose car je ne l'ai vu nulle part ailleurs.
Pour résoudre ce problème dans Xamarin Android, j'ai utilisé le code de @DuaneHomick et ajouté dans
MainActivity.OnCreate()
. La différence avec Xamarin est qu'il faut aller aprèsXamarin.Forms.Forms.Init(this, bundle);
etLoadApplication(new App());
. Donc, monOnCreate()
ressemblerait à:* Edit: Depuis Android 6.0, la solution ci-dessus n'est pas suffisante pour certaines situations. Je me suis maintenant également mis
LaunchMode
àSingleTask
, ce qui semble avoir à nouveau fait fonctionner correctement les choses. Je ne sais malheureusement pas quels effets cela pourrait avoir sur d'autres choses.la source
J'ai eu le même problème et je l'ai résolu en utilisant la solution suivante.
Dans votre activité principale, ajoutez ce code en haut de la
onCreate
méthode:n'oubliez pas d'ajouter cette autorisation dans votre manifeste.
j'espère que cela vous aide.
la source
J'ai aussi eu ce problème
android:configChanges="mcc|mnc"
- si vous avez une connexion au cellulaire, voir http://developer.android.com/guide/topics/manifest/activity-element.html#config pour savoir quelle configuration il y a lors du démarrage du système ou push open ou autre.la source
Essayez cette solution:
créez une
Application
classe et définissez-y:Ensuite, dans votre première activité (Launcher)
onCreate
avant d'setContentView(...)
ajouter ceci:PS
Controller
est maApplication
classe.la source
IS_APP_RUNNING
seratrue
et votre application se fermera immédiatement. Ce n'est pas quelque chose que l'utilisateur trouvera probablement amusant.essayez d'utiliser le mode de lancement SingleInstance avec l'affinité définie pour autoriser la préparation de la tâche Cela créera toujours l'activité dans une nouvelle tâche mais permettra également son reparenting. Vérifier les: attribut d'affinité
la source
J'ai trouvé un moyen d'éviter de commencer les mêmes activités, cela fonctionne très bien pour moi
la source