J'ai un scénario où, après la connexion via une page de connexion, il y aura une déconnexion button
sur chacun activity
.
En cliquant sign-out
, je transmettrai le nom session id
de l'utilisateur connecté à la déconnexion. Quelqu'un peut-il me guider sur la façon de rester session id
accessible à tous activities
?
Toute alternative à ce cas
Réponses:
La façon la plus simple de le faire serait de transmettre l'ID de session à l'activité de déconnexion dans le
Intent
que vous utilisez pour démarrer l'activité:Accédez à cette intention lors de la prochaine activité:
La documentation pour Intents contient plus d'informations (consultez la section intitulée "Extras").
la source
Long session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
setData
et quelle est la différence entre ces deux approches? Quel est le meilleur?Dans votre activité actuelle, créez un nouveau
Intent
:Ensuite, dans la nouvelle activité, récupérez ces valeurs:
Utilisez cette technique pour passer des variables d'une activité à l'autre.
la source
extras.getInt("new_variable_name")
. Si vous essayez de l'obtenir viagetString()
Android, voyez qu'un int a été donné et renvoie null!startActivity(i);
? Je veux dire, puis-je faire l' activité A appeler l' activité B , et qui renvoie des données à l' activité A ? suis-je confus?Passer les extras d' intention est une bonne approche, comme l'a noté Erich.
L' objet Application est un autre moyen cependant, et il est parfois plus facile de gérer le même état sur plusieurs activités (par opposition à devoir le mettre / le mettre partout), ou des objets plus complexes que les primitives et les chaînes.
Vous pouvez étendre Application, puis définir / obtenir ce que vous voulez et y accéder à partir de n'importe quelle activité (dans la même application) avec getApplication () .
Gardez également à l'esprit que d'autres approches que vous pourriez voir, comme la statique, peuvent être problématiques car elles peuvent entraîner des fuites de mémoire . L'application permet également de résoudre ce problème.
la source
Classe source:
Classe de destination (classe NewActivity):
la source
Vous n'avez qu'à envoyer des extras tout en appelant votre intention.
Comme ça:
Maintenant, sur la
OnCreate
méthode de votre,SecondActivity
vous pouvez récupérer les extras comme celui-ci.Si la valeur que vous avez envoyée était
long
:Si la valeur que vous avez envoyée était
String
:Si la valeur que vous avez envoyée était
Boolean
:la source
boolean
et deslong
getters qui valent un commentaire IMO, pas une réponse.Cela m'aide à voir les choses dans leur contexte. Voici deux exemples.
Transmission des données vers l'avant
Activité principale
startActivity
.MainActivity.java
Deuxième activité
getIntent()
pour obtenir celuiIntent
qui a commencé la deuxième activité. Ensuite, vous pouvez extraire les données avecgetExtras()
et la clé que vous avez définie dans la première activité. Puisque nos données sont une chaîne, nous allons simplement les utilisergetStringExtra
ici.SecondActivity.java
Transmission de données
Activité principale
startActivityForResult
, en lui fournissant un code de résultat arbitraire.onActivityResult
. Ceci est appelé lorsque la deuxième activité se termine. Vous pouvez vous assurer qu'il s'agit bien de la deuxième activité en vérifiant le code de résultat. (Ceci est utile lorsque vous lancez plusieurs activités différentes à partir de la même activité principale.)Intent
. Les données sont extraites à l'aide d'une paire clé-valeur. Je pourrais utiliser n'importe quelle chaîne pour la clé mais j'utiliserai la prédéfinieIntent.EXTRA_TEXT
puisque j'envoie du texte.MainActivity.java
Deuxième activité
Intent
. Les données sont stockées dans à l'Intent
aide d'une paire clé-valeur. J'ai choisi d'utiliserIntent.EXTRA_TEXT
ma clé.RESULT_OK
et ajoutez l'intention de conserver vos données.finish()
pour fermer la deuxième activité.SecondActivity.java
la source
Mise à jour Notez que je l' avais mentionné l'utilisation de SharedPreference . Il a une API simple et est accessible à travers les activités d'une application. Mais c'est une solution maladroite et un risque pour la sécurité si vous faites circuler des données sensibles. Il est préférable d'utiliser des intentions. Il dispose d'une liste complète de méthodes surchargées qui peuvent être utilisées pour mieux transférer de nombreux types de données différents entre les activités. Jetez un œil à intent.putExtra . Ce lien présente très bien l'utilisation de putExtra.
En passant des données entre les activités, mon approche préférée est de créer une méthode statique pour l'activité pertinente qui inclut les paramètres requis pour lancer l'intention. Ce qui permet ensuite de configurer et de récupérer facilement les paramètres. Donc ça peut ressembler à ça
Ensuite, vous pouvez créer une intention pour l'activité prévue et vous assurer que vous disposez de tous les paramètres. Vous pouvez vous adapter aux fragments. Un exemple simple ci-dessus, mais vous avez l'idée.
la source
Essayez de faire ce qui suit:
Créez une classe "d'aide" simple (usine pour vos intentions), comme ceci:
Ce sera l'usine pour toutes vos intentions. Chaque fois que vous avez besoin d'une nouvelle intention, créez une méthode d'usine statique dans IntentHelper. Pour créer une nouvelle intention, vous devez simplement le dire comme ceci:
Dans votre activité. Lorsque vous souhaitez "enregistrer" certaines données dans une "session", utilisez simplement ce qui suit:
Et envoyez cette intention. Dans l'activité cible, votre champ sera disponible sous la forme:
Alors maintenant, nous pouvons utiliser Intent comme la même ancienne session (comme dans les servlets ou JSP ).
la source
Vous pouvez également transmettre des objets de classe personnalisés en créant une classe parcelable . Le meilleur moyen de le rendre parcellaire est d'écrire votre classe, puis de le coller simplement sur un site comme http://www.parcelabler.com/ . Cliquez sur build et vous obtiendrez un nouveau code. Copiez tout cela et remplacez le contenu de la classe d'origine. Alors-
et obtenez le résultat dans NextActivity comme
Maintenant, vous pouvez simplement utiliser l' objet foo comme vous l'auriez utilisé.
la source
Une autre façon consiste à utiliser un champ statique public dans lequel vous stockez des données, à savoir:
la source
Le moyen le plus pratique de transmettre des données entre les activités consiste à transmettre des intentions. Dans la première activité à partir de laquelle vous souhaitez envoyer des données, vous devez ajouter du code,
Vous devez également importer
Ensuite, dans la prochaine activité (SecondActivity), vous devez récupérer les données de l'intention à l'aide du code suivant.
la source
Vous pouvez utiliser
SharedPreferences
...Enregistrement. Identifiant de session du magasin de temps dans
SharedPreferences
Déconnexion. ID de session d'extraction de temps dans les préférences partagées
Si vous n'avez pas l'ID de session requis, supprimez les préférences partagées:
C'est très utile, car une fois, vous enregistrez la valeur, puis récupérez n'importe où de l'activité.
la source
L'approche standard.
Maintenant, dans votre deuxième activité, récupérez vos données du bundle:
Obtenez le pack
Extraire les données…
la source
i.putExtras()
/getIntent().getString()
qui est proposé par 6 autres réponses ...De l'activité
À l'activité
la source
Bundle
approche basée a déjà été proposée par PRABEESH RK en 2012 et Ajay Venugopal , Krishna . Et pourrait être réduit aui.putExtras()
/getIntent().getString()
qui est proposé par 8 autres réponses ...Vous pouvez envoyer des données entre les activités à l'aide d'un objet intentionnel. Considérez que vous avez deux activités à savoir
FirstActivity
etSecondActivity
.À l'intérieur de FirstActivity:
Utiliser l'intention:
Inside SecondActivity
Vous pouvez maintenant utiliser différentes méthodes de classe de bundle pour obtenir des valeurs transmises à partir de FirstActivity par clé.
Par exemple
bundle.getString("key")
,bundle.getDouble("key")
,bundle.getInt("key")
etc.la source
Bundle
approche basée a déjà été proposée par PRABEESH RK en 2012 et Ajay Venugopal . Et pourrait être réduit aui.putExtras()
/getIntent().getString()
qui est proposé par 7 autres réponses ...Si vous souhaitez transférer le bitmap entre les activités / fragments
Activité
Pour passer un bitmap entre les activités
Et dans la classe Activity
Fragment
Pour passer une image bitmap entre des fragments
Pour recevoir à l'intérieur du SecondFragment
Transfert de grands bitmaps
Si vous obtenez une transaction de classeur ayant échoué, cela signifie que vous dépassez le tampon de transaction de classeur en transférant un élément volumineux d'une activité à une autre.
Donc, dans ce cas, vous devez compresser le bitmap en tant que tableau d'octets, puis le décompresser dans une autre activité , comme celle-ci
Dans la première activité
Et dans la SecondActivity
la source
Vous pouvez le récupérer dans une autre activité. Deux façons:
La deuxième façon est:
la source
Voici ma meilleure pratique et cela aide beaucoup lorsque le projet est énorme et complexe.
Supposons que j'ai 2 activités,
LoginActivity
etHomeActivity
. Je souhaite transmettre 2 paramètres (nom d'utilisateur et mot de passe) deLoginActivity
àHomeActivity
.Tout d'abord, je crée mon
HomeIntent
Voici comment je passe les données dans mon LoginActivity
Dernière étape, voici comment je reçois les données en
HomeActivity
Terminé! Cool :) Je veux juste partager mon expérience. Si vous travaillez sur un petit projet, cela ne devrait pas être le gros problème. Mais lorsque vous travaillez sur un gros projet, cela fait vraiment mal quand vous voulez refactoriser ou corriger des bugs.
la source
Réponse supplémentaire: Conventions de dénomination pour la chaîne de clé
Le processus réel de transmission des données a déjà été répondu, mais la plupart des réponses utilisent des chaînes codées en dur pour le nom de clé dans l'intention. Cela est généralement bien lorsqu'il n'est utilisé que dans votre application. Cependant, la documentation recommande d' utiliser les
EXTRA_*
constantes pour les types de données standardisés.Exemple 1: utilisation des
Intent.EXTRA_*
clésPremière activité
Deuxième activité:
Exemple 2: définition de votre propre
static final
cléSi l'une des
Intent.EXTRA_*
chaînes ne correspond pas à vos besoins, vous pouvez définir la vôtre au début de la première activité.Inclure le nom du package n'est qu'une convention si vous utilisez uniquement la clé dans votre propre application. Mais il est nécessaire d'éviter les conflits de noms si vous créez une sorte de service que d'autres applications peuvent appeler avec une intention.
Première activité:
Deuxième activité:
Exemple 3: utilisation d'une clé de ressource String
Bien que cela ne soit pas mentionné dans la documentation, cette réponse recommande d'utiliser une ressource String pour éviter les dépendances entre les activités.
strings.xml
Première activité
Deuxième activité
la source
Vous pouvez utiliser
Intent
Une autre façon pourrait également utiliser le modèle singleton :
De votre FirstActivity
Sur SecondActivity
la source
Le passage des données entre les activités se fait principalement au moyen d'un objet intentionnel.
Vous devez d'abord attacher les données à l'objet d'intention avec l'utilisation de la
Bundle
classe. Appelez ensuite l'activité à l'aide de l'une des méthodesstartActivity()
oustartActivityForResult()
.Vous pouvez trouver plus d'informations à ce sujet, avec un exemple de l'article de blog Passing data to an Activity .
la source
Intent#putExtra()
). Mais ajoute un autreBundle
et rend les choses plus compliquées.Vous pouvez essayer la préférence partagée, cela peut être une bonne alternative pour partager des données entre les activités
Pour enregistrer l'ID de session -
Les attraper -
la source
Démarrer une autre activité à partir de ces paramètres de passe d'activité via l'objet Bundle
Récupérer sur une autre activité (YourActivity)
C'est ok pour un type de données simple. Mais si vous voulez transmettre des données complexes entre deux activités, vous devez d'abord les sérialiser.
Ici, nous avons le modèle des employés
Vous pouvez utiliser la bibliothèque Gson fournie par Google pour sérialiser les données complexes comme celle-ci
la source
Kotlin
Passer de la première activité
Entrez dans la deuxième activité
Suggestion
Mettez toujours les clés dans un fichier constant pour une manière plus gérée.
la source
la source
Charlie Collins m'a donné une réponse parfaite en utilisant le
Application.class
. Je ne savais pas que nous pouvions le sous-classer aussi facilement. Voici un exemple simplifié utilisant une classe d'application personnalisée.AndroidManifest.xml
Donnez l'
android:name
attribut pour utiliser votre propre classe d'application.MyApplication.java
Utilisez-le comme support de référence mondial. Cela fonctionne très bien dans un même processus.
MainActivity.java
Définissez la référence globale "singleton" sur l'instance d'application.
MyPreferences.java
Un exemple simple où j'utilise une activité principale d'une autre instance d'activité.
la source
J'ai récemment publié l' API Vapor , un framework Android aromatisé jQuery qui simplifie toutes sortes de tâches comme celle-ci. Comme mentionné,
SharedPreferences
c'est une façon de procéder.VaporSharedPreferences
est implémenté en tant que Singleton, ce qui est une option, et dans l'API Vapor, il a une.put(...)
méthode fortement surchargée , vous n'avez donc pas à vous soucier explicitement du type de données que vous validez - à condition qu'il soit pris en charge. Il est également fluide, vous pouvez donc enchaîner les appels:Il enregistre également les modifications automatiquement en option et unifie le processus de lecture et d'écriture sous le capot, vous n'avez donc pas besoin de récupérer explicitement un éditeur comme vous le faites dans Android standard.
Vous pouvez également utiliser un
Intent
. Dans l'API Vapor, vous pouvez également utiliser la.put(...)
méthode de surcharge en chaîne surVaporIntent
:Et passez-le en supplément, comme mentionné dans les autres réponses. Vous pouvez récupérer des extras de votre
Activity
, et de plus si vous utilisezVaporActivity
cela se fait automatiquement pour vous afin que vous puissiez utiliser:Pour les récupérer à l'autre extrémité dans la,
Activity
vous basculez vers.J'espère que cela intéresse certains :)
la source
Première activité:
Deuxième activité:
la source
Vous pouvez transmettre des données entre les activités de l'application de 3 manières
la transmission de données intentionnelles a une certaine limite. Pour une grande quantité de données, vous pouvez utiliser le partage de données au niveau de l'application et en le stockant dans SharedPreference, la taille de votre application augmente
la source
Utilisez une classe globale:
Vous pouvez appeler les setters et les getters de cette classe de toutes les autres classes. Pour ce faire, vous devez créer un objet GlobalClass dans chaque activité:
Ensuite, vous pouvez appeler par exemple:
la source