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?
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.
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.
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!
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);
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).
En outre, vérifiez si Android: noHistory = "true" en activité dans Manifest, si oui, cela ne fonctionnera pas
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.
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.
appelez getParent().startActivityForResult()
depuis votre sous-activité
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
.
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
Si vous avez défini Android:noHistory="true"
dans l'activité de votre fichier AndroidManifest.xml, le problème sera le même ici.
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.
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);
.