web-dev-qa-db-fra.com

Android - startActivityForResult déclenche immédiatement onActivityResult

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

Celui-ci, lorsqu'il est appelé, lance l'activité comme vous le souhaitez, mais je peux voir dans le journal que onActivityResult() est immédiatement déclenché. L'activité apparaît mais RESULT_CANCELED est immédiatement renvoyé à onActivityResult()

J'interagis ensuite avec l'activité, appuie sur un bouton qui appelle finish(), et onActivityResult() n'est pas appelé cette fois (car apparemment, le résultat a déjà été renvoyé).

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

135
TomBomb

Vous ne pouvez pas utiliser startActivityForResult() si votre activité est lancée en tant que singleInstance ou singleTask. Le mode de lancement standard ou singleTop résoudra le problème.

297
Falmarri

De plus, assurez-vous que l'intention n'a pas défini le Intent.FLAG_ACTIVITY_NEW_TASK.

De la docs :

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

91
James Zhang

J'ai déjà vu ce comportement auparavant, veuillez vous assurer que votre activité Destnation (cette activité spéciale) n'est pas singleInstance dans le fichier AndroidManifest. Si l'activité est singleInstance, elle renverra RESULT_CANCELED avant son lancement!

20
pangcong

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

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

startActivityForResult() ne fonctionne pas avec une activité singleInstance ou singleTask dans une version antérieure à Lollipop d'Android. Depuis Android 5 ça marche (voir cette réponse pour plus de détails). 

3
noelicus

En outre, vérifiez si Android: noHistory = "true" en activité dans Manifest, si oui, cela ne fonctionnera pas 

1
Sanju

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

Android:noHistory="true"

Changé en "faux" et fonctionne maintenant bien.

1
user3829751

Pour ActivityGroup ou TabHost et autres, peut-être que xxxActivity est une subActivity de son parent. Alors la startActivityForResult ne peut pas fonctionner mais le parent peut obtenir le résultat.

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

  2. votre parent (la ActivityGroup) sera capable de gérer la onActivityResult. J'ai donc créé une sous-classe de ActivityGroup et géré cette onActivityResult.

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

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

0
fantaxy025025

Si vous avez défini Android:noHistory="true" dans l'activité de votre fichier AndroidManifest.xml, le problème sera le même ici.

0
Yu-Long Chen

onActivityResult() passera également RESULT_CANCELED en tant que resultCode si vous mal orthographiez le nom du package ou de la classe dans le fichier manifeste.

0
musterjunk

Dans le manifeste Android, définissez Android:launchMode="singleTop" pour l'activité que vous souhaitez ouvrir avec le résultat et lors de l'ouverture de l'activité définissez l'indicateur intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);.

0
Krishna