2010-08-11 2 views
1

J'ai essayé cela et cela fonctionne, mais je ne savais pas si c'était une mauvaise chose ou non, car toute l'aide sur les transferts de données entre activités semble utiliser des intentions.Puis-je mettre à jour des membres de données dans une activité d'une autre activité de l'application?

En MainActivity je:

static PilotRecord pilotRecord = new PilotRecord(); //PilotRecord just contains data item declarations 

En MainActivity.onCreate:

pilotRecord.fuel = 100; 

En MainActivity.onClick:

Intent intent = new Intent(this, SubActivity.class); 
startActivityForResult(intent, 0); 

En SubActivity.onCreate je:

MainActivity.pilotRecord.fuel = 200; 

En SubActivity.onClick:

MainActivity.pilotRecord.fuel = 300; 
setResult(RESULT_OK); 
finish(); 

Quand je commence MainActivity, la valeur de carburant est 100

Si je clique dans MainActivity, sous-activité est affiché, comme prévu

Si je clique dans SubActivity, MainActivity est affiché et la valeur de carburant est maintenant 300

Si j'appuie sur le bouton Retour, MainActivity est affiché et la valeur de carburant est maintenant 200

Est-ce que quelqu'un sait de tout problème potentiel avec ce qu'il me semble plus simple à mettre en place que les intentions etc.

  • Frink

Répondre

3

Je crois comprendre que ce que vous faites entraînera perte de données.

La sous-activité ne doit pas manipuler les données de l'activité qui l'a appelée. Je ne pense pas qu'il existe une garantie que votre MainActivity existe même ...

Le système peut décider de le supprimer à tout moment et de le redémarrer lorsque votre SubActivity signale qu'il est prêt à retourner à MainActivity.

Vous devez renvoyer les données dans un regroupement et laisser MainActivity modifier ses données en fonction des résultats.

Bundle stats = new Bundle(); 
    stats.putString("fuel","300"); 
    setResult(RESULT_OK, "PilotRecord", stats); 
    finish(); 

Aussi, rappelez-vous que vous devez économiser le niveau « carburant » à une sorte de stockage persistant quand OnPause() est appelée dans votre MainActivity.

Je suggère de lire attentivement le documentation for Activity car il est très important d'implémenter les bons rappels.

+0

Je pensais qu'il pourrait y avoir une prise que tout le monde me renvoie aux intentions. Merci pour votre explication. Vraisemblablement, je peux toujours faire référence à des constantes comme MainActivity.MAX_FUEL dans ma sous-activité car elles sont résolues au moment de la compilation? Si j'économise du carburant sur le stockage persistant onPause, ai-je besoin de le restaurer sur OnResume, ou sera-t-il déjà là? Ai-je juste besoin de le restaurer onCreate (qui ne serait exécuté que si l'activité est détruite par le système) – FrinkTheBrave

+0

Les données utilisateur persistantes doivent être enregistrées dans onPause() et restaurées dans onResume() et onCreate(). Il vous passera un paquet, mais vous êtes responsable de remplir vos variables avec les données de l'ensemble. Les données d'état de l'application, telles que les données qu'elles saisissent dans une zone de texte, doivent être enregistrées dans onSaveInstanceState() et restaurées dans onRestoreInstanceState(). Sinon, lorsqu'ils font pivoter l'écran ou reçoivent un appel téléphonique, des données temporaires seront perdues lorsque votre application sera envoyée en arrière-plan. –

1

Si vous voulez vraiment le pirater, créez une autre classe qui contient toutes vos variables statiques qui doivent être partagées.

+0

J'ai la classe PilotRecord qui contient toutes les variables, mais elle est instanciée dans MainActivity. Je pense que je pourrais passer la classe entière dans l'intention de et vers chaque sous-activité, donc je peux utiliser le code commun comme c'est la même chose pour chaque classe – FrinkTheBrave

Questions connexes