onActivityResult () appelé prématurément


92

Je démarre le Activity(descendant de PreferenceActivity) de mon activité de travailleur comme suit:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1458)
        loadInfo();
}

void showSettingsDialog()
{
    startActivityForResult(new Intent().setClass(this, MyConfigure.class), 1458);
}

MyConfigurela classe n'a PAS d' setResult()appels. En fait, la MyConfigureclasse n'a pas de code sauf OnCreate()là où elle charge les préférences en utilisant addPreferencesFromResource.

Maintenant onActivityResultest appelé avec requestCodede 1458prématurément, juste après l' MyConfigureexécution de l'activité. Testé sur les émulateurs 1.6 et 2.1 ainsi que sur les appareils 2.1. Y a-t-il un appel à setResult()enterré quelque part PreferenceActivity? Ou comment expliquer autrement cet appel prématuré?


1
Une activité ne se termine pas sur setResults (), elle se termine sur finish (). Pouvez-vous afficher la méthode onCreate de votre activité MyConfigure?
Cheryl Simon

C'est vrai, ce n'est pas le cas. Cependant, quelque chose appelle setResult () à l'avance et je me demande ce que c'est. Le code de onCreate est trivial: la classe publique MyConfigure étend PreferenceActivity {@Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); addPreferencesFromResource (R.xml.preferences); }}
Eugene Mayevski 'Rappel le

comment pensez-vous savoir que setResult est appelé?
RoflcoptrException

C'est exactement ce pour quoi j'ai créé la question. Pour savoir pourquoi onActivityResult est appelé prématurément.
Rappel d'Eugene Mayevski le

Que dit la sortie de logcat autour de cette période? Plus précisément, la balise "ActivityManager", qui montre quels Intents sont appelés.
Christopher Orr

Réponses:


254

Ceci est résolu en changeant le mode de lancement en singleTop:

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop">

Il y a un bogue / fonctionnalité (?) Dans Android, qui signale immédiatement le résultat (qui n'a pas encore été défini) pour Activity, déclaré comme singleTask(malgré le fait que l'activité continue de s'exécuter). Si nous changeons launchModel'activité parent de singleTaskà singleTop, tout fonctionne comme prévu - le résultat n'est signalé qu'une fois l'activité terminée. Bien que ce comportement ait une certaine explication (une seule singleTaskactivité peut exister et il peut y avoir plusieurs serveurs pour cela), ce n'est toujours pas une restriction logique pour moi.


2
Cela semble un bug! ^^ comportement très bizarre!
Felipe

7
Si l'activité a le mode de lancement singleTask, il n'est pas nécessaire de recevoir les résultats des sous-activités utilisant onActivityResult. Les sous-activités appellent simplement finish (), puis démarrent l'activité principale avec l'intention de données. Dans l'activité principale, vous devez remplacer la méthode onNewIntent et traiter l'intention reçue.
Nik

43
launchMode = "singleInstance" provoque également ce comportement
ffleandro

1
Il semble que cela n'a pas fonctionné pour moi, j'ai essayé singleTop sur l'activité des parents mais en vain. J'ai également défini l'indicateur d'intention sur FLAG_ACTIVITY_SINGLE_TOP, bien que la demande affiche maintenant la valeur correcte mais le résultat est toujours 0.
Neon Warge

11
cela se produit sur Kitkat 4.4.4, pas sur Lolipop.
Somasundaram Mahesh

18

J'ai résolu mon problème après la suppression intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);avant d'appeler fragment.startActivityForResult(intent, 0);.


1
Je vous remercie! Cela a résolu mon problème. Y a-t-il une explication à cela quelque part?
Conner Harkness

Il y a une explication à cela dans la documentation pour le drapeau ces jours-ci "Ce drapeau ne peut pas être utilisé lorsque l'appelant demande un résultat de l'activité en cours de lancement". Eh bien, ce n'est pas une explication mais au moins un avertissement!
Code Noviciat

4

Je viens de supprimer tous mes "android: launchMode" personnalisés de mon activité et tout a fonctionné comme un charme. Ce n'est pas une bonne idée de changer cela lorsque vous ne savez pas exactement ce qu'Android comprend ... Android est un peu délicat de cette façon.


1

Cela m'est arrivé lorsque l'intention avait Intent.FLAG_RECEIVER_FOREGROUNDdéfini le drapeau.

(Oui, ce drapeau n'est pas lié à l'activité, mais je l'avais à toutes mes intentions dans le cadre d'une solution de fusil de chasse à un problème différent .)


-1

Encore une fois, comme dans le commentaire de Mayra, cela setResult()n'a rien à voir avec votre problème. pour une raison quelconque, la MyConfigureclasse se termine d'elle-même et quand cela se produit PreferenceActivitysuppose simplement qu'il pourrait y avoir un résultat MyConfigureparce que c'est ainsi que vous avez écrit le code.

cela se produit également lorsque vous forcez une activité qui a commencé avec startActivityForResult()...

Donc, je pense qu'il vaut mieux se concentrer sur les raisons pour lesquelles votre MyConfigurecours est terminé de force.


La classe MyConfigure ne se termine PAS, vos suppositions sont fausses, désolé. Si c'était le cas, il n'y aurait aucune question
Eugene Mayevski 'Rappel du
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.