Android - startActivityForResult déclenchant immédiatement onActivityResult


144

Je lance des activités à partir de l'activité principale dans mon application à l'aide de l'appel startActivityForResult(intent, ACTIVITY_TYPE), et elles fonctionnent toutes sauf une.

Celui-ci, lorsqu'il est appelé, lance l'activité comme souhaité, mais dans le journal, je peux voir qu'elle onActivityResult()est immédiatement déclenchée. L'activité apparaît mais RESULT_CANCELEDest immédiatement renvoyée onActivityResult().

J'interagis alors avec l'activité, appuie sur un bouton qui appelle finish(), et onActivityResult()ne s'appelle pas cette fois (car apparemment un résultat a déjà été retourné).

Est-ce que ceci signifie quelque chose pour quelqu'un? Quelqu'un a-t-il déjà vu ce comportement?

Réponses:


315

Vous ne pouvez pas utiliser startActivityForResult()si votre activité est lancée en tant que singleInstanceou singleTask. standardou le singleTopmode de lancement résoudra le problème.


2
Merci à vous deux, j'avais ceci dans mon fichier manifeste et je l'avais totalement oublié
TomBomb

9
HOU LA LA! Cela semble être une chose évidente à ajouter aux javadocs! J'ai perdu une soirée entière à essayer de faire fonctionner cela, et cette réponse SO m'a rappelé que mon activité était définie sur singleTop.
swooby

20
singleTopsemble bien pour moi, singleTaskmais causait ce problème et singleInstanceferait donc certainement aussi
darnmason

4
J'ai aussi passé beaucoup trop de temps à déboguer ça! Merci!!
suomi35

4
Dans mon cas, je n'ai défini aucune classe comme singleInstance ou singleTop, mais cela se produit toujours ... une suggestion?
CoDe

110

En outre, assurez-vous que l'intention n'a pas l' Intent.FLAG_ACTIVITY_NEW_TASKensemble.

À partir de la documentation :

Cet indicateur ne peut pas être utilisé lorsque l'appelant demande un résultat de l'activité en cours de lancement.


3
Cela a résolu le problème dans mon cas. Le problème n'était pas causé par singleInstance, singleTop ou singleTask.
Diana

Vous êtes une menthe (un sauveur de vie). C'était exactement mon problème lorsque je voulais que l'utilisateur capture une image dans un fragment
kyay

@Diana, vous souvenez-vous de ce que vous avez utilisé à la place Intent.FLAG_ACTIVITY_NEW_TASK?
Keselme

@Keselme Désolé, ça fait longtemps, j'aimerais pouvoir aider mais je ne m'en souviens plus et je ne peux plus accéder à ce code.
Diana

Oui, corrigé. startActivityForResult ne doit pas être utilisé avec Intent.FLAG_ACTIVITY_NEW_TASK
hanilozmen

21

J'ai déjà vu ce comportement, veuillez vous assurer que votre activité de destination (cette activité spéciale) n'est pas singleInstancedans le fichier AndroidManifest. Si l'activité est singleInstance, elle reviendra RESULT_CANCELEDavant d'être lancée!


18

Je voudrais également ajouter que vous pouvez appeler une application externe avec:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
Ce qui créerait une intention avec Intent.FLAG_ACTIVITY_NEW_TASKajouté par défaut, alors appelez:
in.setFlags(0);
Ce qui effacera cet indicateur, puis vous pourrez procéder à:startActivityForResult(in, action);

La raison pour laquelle je fais cela est que j'ai une application utilitaire qui a des fonctionnalités communes à quelques autres applications et que je peux conserver les modifications de code à un emplacement au lieu de me soucier de plusieurs mises à jour.


Je sais que c'est vieux, mais c'était tellement absolument inestimable pour moi que je voulais dire merci à l'utilisateur, et faire remarquer à quiconque saute entre les activités que c'est de l'or effrayant! J'ai sauvé mon cul lors d'un hackathon;)
Wes Winn

C'est ce qui mérite plus d'attention. C'est la meilleure solution et fonctionne parfaitement pour moi. Vous m'avez fait gagner beaucoup de temps, merci beaucoup.
Aritra Roy

Voter cette réponse car c'était exactement le problème que j'avais ce matin! Merci pour la solution!
Will Johnson

Merci. intent.setFlags (0) a résolu le problème. Maintenant, la deuxième application démarre correctement et renvoie le résultat à l'application appelante
Niaz

5

startActivityForResult()ne fonctionne pas avec une activité singleInstanceou singleTaskdans la version pré-lollipop d'Android. Depuis Android 5, cela fonctionne (voir cette réponse pour plus de détails).


5

Il se déclenche également si vous avez FLAG_ACTIVITY_NEW_TASKdans votre intention.

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);

Merci. J'ai ajouté FLAG_ACTIVITY_NEW_TASK à mon activité.
Chirag Savsani

1

Mon problème était avec l'activité d'appel. Sa déclaration dans AndroidManifest avait la propriété suivante:

android:noHistory="true"

Changé en "faux" et fonctionne maintenant très bien.


1

Android 4.4 a un petit problème sur l'attente du retour à la fin de la fermeture de l'activité Pour résoudre ce problème, il est important de définir:

  • toutes les activités auront le même attribut d'affinité de tâche. ( TaskAffinity = "[SAME STRING]")
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

Cette solution fonctionne avec toutes les versions d'Android

Voir ceci pour taskAffinity: https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-called-instantly/1004072


1

Vérifiez également si android: noHistory = "true" sur l'activité dans Manifest, si oui, cela ne fonctionnera pas.


0

Pour ActivityGroupou TabHostet d'autres, peut-être que le xxxActivityest un subActivityde son parent. Ensuite, le startActivityForResultne peut pas fonctionner mais le parent peut obtenir le résultat.

  1. appel getParent().startActivityForResult()depuis votre sous-activité

  2. votre parent (le ActivityGroup) sera en mesure de gérer le onActivityResult. J'ai donc créé une sous-classe ActivityGroupet géré cela onActivityResult.

  3. Vous pouvez réacheminer ce résultat vers la sous-activité si vous en avez besoin. Obtenez juste l'activité actuelle getLocalActivityManager().getCurrentActivity(). Mes sous-activités héritent d'une activité personnalisée, j'ai donc ajouté une handleActivityResult(requestCode, resultCode, data)dans cette sous-classe pour l' ActivityGroupappel.

exemple: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html


Que pensez - vous de ce cas particulier lors de l' appel Brower Web par défaut: codeproject.com/Questions/990063/...
Ahmad Ebrahimi

0

onActivityResult()passera également RESULT_CANCELEDcomme resultCodesi vous avez mal orthographié le nom du package ou de la classe dans le fichier manifeste.


0

Dans Android Manifest défini android:launchMode="singleTop"pour l'activité que vous souhaitez ouvrir avec le résultat et lors de l'ouverture de l'indicateur d'ensemble d'activitésintent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


0

Si vous avez défini android:noHistory="true"l'activité dans votre AndroidManifest.xml, cela provoquera le même problème ici.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.