web-dev-qa-db-fra.com

onActivityResult () appelé prématurément

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);
}

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

Maintenant, onActivityResult est appelé avec requestCode de 1458 Prématurément, juste après l'exécution de l'activité de MyConfigure. Testé sur des émulateurs 1.6 et 2.1 ainsi que sur un appareil 2.1. Y a-t-il un appel à setResult() enterré quelque part dans PreferenceActivity? Ou comment expliquer autrement cet appel prématuré?

Ceci est corrigé en changeant le mode de lancement en singleTop:

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

Il y a un bogue/fonctionnalité (?) Dans Android, qui rapporte 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 modifions launchMode de l'activité parent de singleTask à singleTop, tout fonctionne comme prévu - le résultat n'est signalé qu'après la fin de l'activité. Bien que ce comportement ait une explication certaine (une seule activité singleTask peut exister et il peut y avoir plusieurs serveurs), ce n'est toujours pas une restriction logique pour moi.

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

16
teapeng

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 que Android comprend ... Android est un peu délicat de cette façon).

4
Felipe

Cela m'est arrivé lorsque l'intention avait le Intent.FLAG_RECEIVER_FOREGROUND jeu de drapeaux.

(Oui, ce drapeau n'est pas lié à l'activité, mais je l'ai eu à toutes fins utiles dans le cadre d'une solution de fusil de chasse pour n problème différent .)

1
Sam