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