Πώς μπορώ να περάσω δεδομένα μεταξύ δραστηριοτήτων σε εφαρμογή Android;

Έχω ένα σενάριο όπου, μετά την είσοδο μέσω μιας σελίδας σύνδεσης, θα υπάρχει ένα "κουμπί" εξόδου σε κάθε "δραστηριότητα".

Κάνοντας κλικ στο κουμπί sign-out, θα περάσω το session id του χρήστη που έχει συνδεθεί για να κάνει sign-out. Μπορεί κάποιος να με καθοδηγήσει για το πώς μπορώ να κρατήσω το session id διαθέσιμο σε όλες τις activities;

Οποιαδήποτε εναλλακτική λύση σε αυτή την περίπτωση

Λύση

Ο ευκολότερος τρόπος για να το κάνετε αυτό θα ήταν να περάσετε το αναγνωριστικό συνεδρίας στη δραστηριότητα αποσύνδεσης στο Intent που χρησιμοποιείτε για να ξεκινήσετε τη δραστηριότητα:

Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);

Πρόσβαση σε αυτή την πρόθεση στην επόμενη δραστηριότητα:

String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");

Το docs για τις προθέσεις έχει περισσότερες πληροφορίες (δείτε την ενότητα με τίτλο "Extras").

Σχόλια (12)

Το πέρασμα Intent extras είναι μια καλή προσέγγιση, όπως σημείωσε ο Erich.

Το αντικείμενο Application είναι ένας άλλος τρόπος όμως, και είναι μερικές φορές ευκολότερο όταν έχουμε να κάνουμε με την ίδια κατάσταση σε πολλαπλές δραστηριότητες (σε αντίθεση με το να πρέπει να την παίρνουμε/βάζουμε παντού), ή με αντικείμενα πιο πολύπλοκα από τα primitives και τα Strings.

Μπορείτε να επεκτείνετε το Application, και στη συνέχεια να ορίσετε/πάρτε ό,τι θέλετε εκεί και να έχετε πρόσβαση σε αυτό από οποιοδήποτε Activity (στην ίδια εφαρμογή) με την getApplication().

Να έχετε επίσης υπόψη σας ότι άλλες προσεγγίσεις που μπορεί να δείτε, όπως τα statics, μπορεί να είναι προβληματικές επειδή μπορούν να οδηγήσουν σε διαρροές μνήμης. Η εφαρμογή βοηθάει να λυθεί και αυτό.

Σχόλια (6)

Προσπαθήστε να κάνετε τα εξής:

Δημιουργήστε μια απλή "βοηθητική" κλάση (εργοστάσιο για τα Intents σας), όπως αυτή:

import android.content.Intent;

public class IntentHelper {
    public static final Intent createYourSpecialIntent(Intent src) {
          return new Intent("YourSpecialIntent").addCategory("YourSpecialCategory").putExtras(src);
    }
}

Αυτή θα είναι το εργοστάσιο για όλα τα Intents σας. Κάθε φορά που χρειάζεστε ένα νέο Intent, δημιουργήστε μια στατική εργοστασιακή μέθοδο στο IntentHelper. Για να δημιουργήσετε ένα νέο Intent θα πρέπει απλά να το πείτε ως εξής:

IntentHelper.createYourSpecialIntent(getIntent());

Στη δραστηριότητά σας. Όταν θέλετε να "αποθηκεύσετε" κάποια δεδομένα σε μια "συνεδρία" απλά χρησιμοποιήστε το εξής:

IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);

Και στείλτε αυτό το Intent. Στη Δραστηριότητα-στόχο το πεδίο σας θα είναι διαθέσιμο ως:

getIntent().getStringExtra("YOUR_FIELD_NAME");

Έτσι τώρα μπορούμε να χρησιμοποιήσουμε το Intent όπως την ίδια παλιά συνεδρία (όπως στα servlets ή στο JSP).

Σχόλια (0)