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é?

Rappel d'Eugene Mayevski
la source
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.

Rappel d'Eugene Mayevski
la source
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);.

TPG
la source
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.

Felipe
la source
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 .)

Sam
la source
-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.

optimystery
la source
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