Ich habe ein Szenario , in dem, nach dem in durch eine Login - Seite anmelden, wird es eine Abmelde sein button
auf jedem activity
.
Beim Klicken übergebe sign-out
ich session id
den angemeldeten Benutzer an die Abmeldung. Kann mich jemand anleiten, wie ich session id
für alle verfügbar bleiben kann activities
?
Jede Alternative zu diesem Fall
Antworten:
Der einfachste Weg, dies zu tun, besteht darin, die Sitzungs-ID an die Abmeldeaktivität zu übergeben, mit der
Intent
Sie die Aktivität starten:Greifen Sie bei der nächsten Aktivität auf diese Absicht zu:
In den Dokumenten für Absichten finden Sie weitere Informationen (siehe Abschnitt "Extras").
quelle
Long session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
setData
und was ist der Unterschied zwischen diesen beiden Ansätzen? Welches ist besser?Erstellen Sie in Ihrer aktuellen Aktivität eine neue
Intent
:Rufen Sie dann in der neuen Aktivität die folgenden Werte ab:
Verwenden Sie diese Technik, um Variablen von einer Aktivität zur anderen zu übergeben.
quelle
extras.getInt("new_variable_name")
. Wenn Sie versuchen, es übergetString()
Android zu bekommen, sehen Sie, dass ein int gegeben wurde und null zurückgibt!startActivity(i);
? Ich meine, kann ich Aktivität A dazu bringen , Aktivität B aufzurufen , und das gibt Daten an Aktivität A zurück ? bin ich verwirrtVorbeigehen Absichts- Extras ist ein guter Ansatz, wie Erich bemerkte.
Das Anwendungsobjekt ist jedoch eine andere Möglichkeit, und es ist manchmal einfacher, mit demselben Status über mehrere Aktivitäten hinweg umzugehen (im Gegensatz dazu, dass es überall abgerufen / platziert werden muss) oder mit Objekten, die komplexer als Grundelemente und Zeichenfolgen sind.
Sie können die Anwendung erweitern und dort festlegen / abrufen, was Sie möchten, und von jeder Aktivität (in derselben Anwendung) mit darauf zugreifen abrufen getApplication () darauf zugreifen .
Denken Sie auch daran, dass andere Ansätze, wie z. B. die Statik, problematisch sein können, da sie zu Speicherverlusten führen können . Die Anwendung hilft auch, dies zu lösen.
quelle
Quellklasse:
Zielklasse (NewActivity-Klasse):
quelle
Sie müssen nur Extras senden, während Sie Ihre Absicht anrufen.
So was:
Jetzt können Sie auf
OnCreate
Ihre MethodeSecondActivity
die Extras wie folgt abrufen.Wenn der von Ihnen gesendete Wert in war
long
:Wenn der von Ihnen gesendete Wert a war
String
:Wenn der von Ihnen gesendete Wert a war
Boolean
:quelle
boolean
undlong
Getter, die IMO einen Kommentar wert sind, keine Antwort.Es hilft mir, die Dinge im Kontext zu sehen. Hier sind zwei Beispiele.
Daten weiterleiten
Hauptaktivität
startActivity
.MainActivity.java
Zweite Aktivität
getIntent()
, umIntent
die zweite Aktivität zu starten. Anschließend können Sie die Daten mitgetExtras()
und den Schlüssel extrahieren, den Sie in der ersten Aktivität definiert haben. Da unsere Daten ein String sind, werden wir sie hier nur verwendengetStringExtra
.SecondActivity.java
Daten zurückgeben
Hauptaktivität
startActivityForResult
und geben Sie einen beliebigen Ergebniscode ein.onActivityResult
. Dies wird aufgerufen, wenn die zweite Aktivität beendet ist. Sie können sicherstellen, dass es sich tatsächlich um die zweite Aktivität handelt, indem Sie den Ergebniscode überprüfen. (Dies ist nützlich, wenn Sie mehrere verschiedene Aktivitäten von derselben Hauptaktivität aus starten.)Intent
. Die Daten werden mit einem Schlüssel-Wert-Paar extrahiert. Ich könnte eine beliebige Zeichenfolge für den Schlüssel verwenden, aber ich werde die vordefinierte verwenden,Intent.EXTRA_TEXT
da ich Text sende.MainActivity.java
Zweite Aktivität
Intent
. Die Daten werden unterIntent
Verwendung eines Schlüssel-Wert-Paares im gespeichert . Ich habe michIntent.EXTRA_TEXT
für meinen Schlüssel entschieden.RESULT_OK
und fügen Sie die Absicht hinzu, die Ihre Daten enthält.finish()
an, um die zweite Aktivität zu schließen.SecondActivity.java
quelle
Aktualisiert Beachten Sie, dass ich die Verwendung von SharedPreference erwähnt habe . Es verfügt über eine einfache API und ist für alle Aktivitäten einer Anwendung zugänglich. Dies ist jedoch eine ungeschickte Lösung und ein Sicherheitsrisiko, wenn Sie vertrauliche Daten weitergeben. Es ist am besten, Absichten zu verwenden. Es verfügt über eine umfangreiche Liste überladener Methoden, mit denen viele verschiedene Datentypen zwischen Aktivitäten besser übertragen werden können. Schauen Sie sich intent.putExtra an . Dieser Link zeigt die Verwendung von putExtra recht gut.
Beim Übergeben von Daten zwischen Aktivitäten besteht mein bevorzugter Ansatz darin, eine statische Methode für die relevante Aktivität zu erstellen, die die erforderlichen Parameter enthält, um die Absicht zu starten. Das bietet dann ein einfaches Einrichten und Abrufen von Parametern. So kann es aussehen
Anschließend können Sie eine Absicht für die beabsichtigte Aktivität erstellen und sicherstellen, dass Sie über alle Parameter verfügen. Sie können für Fragmente an anpassen. Ein einfaches Beispiel oben, aber Sie bekommen die Idee.
quelle
Versuchen Sie Folgendes zu tun:
Erstellen Sie eine einfache "Helfer" -Klasse (Factory für Ihre Absichten) wie folgt:
Dies wird die Fabrik für alle Ihre Absichten sein. Erstellen Sie jedes Mal, wenn Sie einen neuen Intent benötigen, eine statische Factory-Methode in IntentHelper. Um eine neue Absicht zu erstellen, sollten Sie sie einfach so sagen:
In Ihrer Tätigkeit. Wenn Sie einige Daten in einer "Sitzung" "speichern" möchten, verwenden Sie einfach Folgendes:
Und senden Sie diese Absicht. In der Zielaktivität ist Ihr Feld verfügbar als:
Jetzt können wir Intent wie dieselbe alte Sitzung verwenden (wie in Servlets oder JSP ).
quelle
Sie können benutzerdefinierte Klassenobjekte auch übergeben, indem Sie eine Paketklasse erstellen . Der beste Weg, um es paketfähig zu machen, besteht darin, Ihre Klasse zu schreiben und sie dann einfach auf einer Website wie http://www.parcelabler.com/ einzufügen . Klicken Sie auf Build und Sie erhalten neuen Code. Kopieren Sie all dies und ersetzen Sie den ursprünglichen Klasseninhalt. Dann-
und erhalten Sie das Ergebnis in NextActivity wie-
Jetzt können Sie das foo- Objekt einfach so verwenden, wie Sie es verwendet hätten.
quelle
Eine andere Möglichkeit besteht darin, ein öffentliches statisches Feld zu verwenden, in dem Sie Daten speichern, dh:
quelle
Der bequemste Weg, Daten zwischen Aktivitäten zu übertragen, ist das Übergeben von Absichten. In der ersten Aktivität, von der aus Sie Daten senden möchten, sollten Sie Code hinzufügen:
Sie sollten auch importieren
In der nächsten Aktivität (SecondActivity) sollten Sie dann die Daten aus der Absicht mit dem folgenden Code abrufen.
quelle
Sie können verwenden
SharedPreferences
...Protokollierung. Sitzungs-ID des Zeitspeichers in
SharedPreferences
Ausloggen. Zeitabruf-Sitzungs-ID in gemeinsam genutzten Einstellungen
Wenn Sie nicht über die erforderliche Sitzungs-ID verfügen, entfernen Sie die freigegebenen Einstellungen:
Das ist sehr nützlich, da Sie den Wert einmal speichern und dann irgendwo eine Aktivität abrufen.
quelle
Der Standardansatz.
Rufen Sie jetzt in Ihrer zweiten Aktivität Ihre Daten aus dem Bundle ab:
Holen Sie sich das Bundle
Daten extrahieren…
quelle
i.putExtras()
/ reduziert werden, dasgetIntent().getString()
durch 6 andere Antworten vorgeschlagen wird ...Aus der Aktivität
Zur Aktivität
quelle
Bundle
basierte Ansatz wurde bereits 2012 von PRABEESH RK und Ajay Venugopal , Krishna, vorgeschlagen . Und könnte auf dasi.putExtras()
/ reduziert werden, dasgetIntent().getString()
von 8 anderen Antworten vorgeschlagen wird ...Sie können Daten zwischen Aktivitäten mit dem Intent-Objekt senden. Stellen Sie sich vor, Sie haben zwei Aktivitäten, nämlich
FirstActivity
undSecondActivity
.Inside FirstActivity:
Intent verwenden:
Innerhalb von SecondActivity
Jetzt können Sie verschiedene Methoden für Bundle-Klassen verwenden, um Werte von FirstActivity by Key zu erhalten.
Zum Beispiel
bundle.getString("key")
,bundle.getDouble("key")
,bundle.getInt("key")
usw.quelle
Bundle
basierte Ansatz wurde bereits 2012 von PRABEESH RK und Ajay Venugopal vorgeschlagen . Und könnte auf dasi.putExtras()
/ reduziert werden, dasgetIntent().getString()
von 7 anderen Antworten vorgeschlagen wird ...Wenn Sie eine Bitmap zwischen Aktivitäten / Fragmenten übertragen möchten
Aktivität
So übergeben Sie eine Bitmap zwischen Aktivitäten
Und in der Aktivitätsklasse
Fragment
Eine Bitmap zwischen Fragmenten übergeben
Im SecondFragment empfangen
Große Bitmaps übertragen
Wenn Sie eine fehlgeschlagene Binder-Transaktion erhalten, bedeutet dies, dass Sie den Binder-Transaktionspuffer überschreiten, indem Sie ein großes Element von einer Aktivität zu einer anderen Aktivität übertragen.
In diesem Fall müssen Sie die Bitmap als Byte-Array komprimieren und dann in einer anderen Aktivität wie dieser dekomprimieren
In der FirstActivity
Und in der SecondActivity
quelle
Sie können es in einer anderen Aktivität abrufen. Zwei Wege:
Der zweite Weg ist:
quelle
Hier ist meine beste Vorgehensweise und sie hilft sehr, wenn das Projekt riesig und komplex ist.
Angenommen, ich habe 2 Aktivitäten
LoginActivity
undHomeActivity
. Ich möchte 2 Parameter (Benutzername & Passwort) vonLoginActivity
an übergebenHomeActivity
.Zuerst erstelle ich meine
HomeIntent
So übergebe ich die Daten in meiner LoginActivity
Letzter Schritt, hier ist, wie ich die Daten in erhalte
HomeActivity
Erledigt! Cool :) Ich möchte nur meine Erfahrungen teilen. Wenn Sie an einem kleinen Projekt arbeiten, sollte dies nicht das große Problem sein. Aber wenn Sie an einem großen Projekt arbeiten, tut es wirklich weh, wenn Sie Refactoring oder Fehlerbehebung durchführen möchten.
quelle
Ergänzende Antwort: Namenskonventionen für die Schlüsselzeichenfolge
Der eigentliche Prozess der Datenübergabe wurde bereits beantwortet, die meisten Antworten verwenden jedoch fest codierte Zeichenfolgen für den Schlüsselnamen in der Absicht. Dies ist normalerweise in Ordnung, wenn es nur in Ihrer App verwendet wird. In der Dokumentation wird jedoch die Verwendung von empfohlen
EXTRA_*
Konstanten für standardisierte Datentypen zu verwenden.Beispiel 1: Verwenden von
Intent.EXTRA_*
SchlüsselnErste Aktivität
Zweite Aktivität:
Beispiel 2: Definieren Sie Ihre eigenen
static final
SchlüsselWenn eine der
Intent.EXTRA_*
Zeichenfolgen nicht Ihren Anforderungen entspricht, können Sie zu Beginn der ersten Aktivität eine eigene definieren.Das Einfügen des Paketnamens ist nur eine Konvention, wenn Sie den Schlüssel nur in Ihrer eigenen App verwenden. Es ist jedoch unbedingt erforderlich, Namenskonflikte zu vermeiden, wenn Sie einen Dienst erstellen, den andere Apps mit Absicht aufrufen können.
Erste Aktivität:
Zweite Aktivität:
Beispiel 3: Verwenden eines String-Ressourcenschlüssels
Obwohl in der Dokumentation nicht erwähnt, empfiehlt diese Antwort die Verwendung einer String-Ressource, um Abhängigkeiten zwischen Aktivitäten zu vermeiden.
string.xml
Erste Aktivität
Zweite Aktivität
quelle
Sie können verwenden
Intent
Ein anderer Weg könnte auch die Verwendung eines Singleton-Musters sein :
Aus Ihrer FirstActivity
Auf SecondActivity
quelle
Die Weitergabe von Daten zwischen Aktivitäten erfolgt hauptsächlich über ein Absichtsobjekt.
Zuerst müssen Sie die Daten unter Verwendung der
Bundle
Klasse an das Intent-Objekt anhängen . Rufen Sie dann die Aktivität mit einerstartActivity()
oder beidenstartActivityForResult()
Methoden auf.Weitere Informationen dazu finden Sie am Beispiel des Blogposts Übergeben von Daten an eine Aktivität .
quelle
Intent#putExtra()
). Fügt aber noch einen hinzuBundle
und macht die Sache komplizierter.Sie können Shared Preference ausprobieren. Dies ist möglicherweise eine gute Alternative für den Datenaustausch zwischen den Aktivitäten
So speichern Sie die Sitzungs-ID:
Um sie zu bekommen -
quelle
Starten Sie eine andere Aktivität von diesem Aktivitätsübergabeparameter über Bundle Object
Bei einer anderen Aktivität abrufen (YourActivity)
Dies ist für einfache Datentypen in Ordnung. Wenn Sie jedoch komplexe Daten zwischen den Aktivitäten übergeben möchten, müssen Sie diese zuerst serialisieren.
Hier haben wir das Mitarbeitermodell
Sie können die von Google bereitgestellte Gson lib verwenden, um die komplexen Daten wie folgt zu serialisieren
quelle
Kotlin
Pass von der ersten Aktivität
Holen Sie sich in der zweiten Aktivität
Vorschlag
Legen Sie die Schlüssel immer in einer konstanten Datei ab, um sie besser verwalten zu können.
quelle
quelle
Charlie Collins gab mir eine perfekte Antwort mit dem
Application.class
. Mir war nicht bewusst, dass wir es so einfach unterordnen können. Hier ist ein vereinfachtes Beispiel mit einer benutzerdefinierten Anwendungsklasse.AndroidManifest.xml
Geben Sie das
android:name
Attribut an, um Ihre eigene Anwendungsklasse zu verwenden.MyApplication.java
Verwenden Sie dies als globalen Referenzinhaber. Es funktioniert gut in einem gleichen Prozess.
MainActivity.java
Legen Sie die globale "Singleton" -Referenz auf die Anwendungsinstanz fest.
MyPreferences.java
Ein einfaches Beispiel, in dem ich eine Hauptaktivität aus einer anderen Aktivitätsinstanz verwende.
quelle
Ich habe kürzlich die Vapor API veröffentlicht , ein Android-Framework mit jQuery-Geschmack, das alle möglichen Aufgaben wie diese vereinfacht. Wie bereits erwähnt,
SharedPreferences
ist dies eine Möglichkeit, dies zu tun.VaporSharedPreferences
wird als Singleton implementiert, sodass dies eine Option ist. In der Vapor-API ist die.put(...)
Methode stark überlastet , sodass Sie sich nicht explizit um den von Ihnen festgeschriebenen Datentyp kümmern müssen, sofern dieser unterstützt wird. Es ist auch fließend, so dass Sie Anrufe verketten können:Optional werden Änderungen automatisch gespeichert und der Lese- und Schreibprozess unter der Haube vereinheitlicht, sodass Sie einen Editor nicht explizit abrufen müssen, wie dies bei Standard-Android der Fall ist.
Alternativ können Sie eine verwenden
Intent
. In der Vapor-API können Sie die verkettete überladene.put(...)
Methode auch für Folgendes verwendenVaporIntent
:Und geben Sie es als Extra weiter, wie in den anderen Antworten erwähnt. Sie können Extras von Ihrem abrufen
Activity
, und wenn SieVaporActivity
dies verwenden, wird dies automatisch für Sie erledigt, sodass Sie Folgendes verwenden können:Um sie am anderen Ende abzurufen,
Activity
wechseln Sie zu.Hoffe das ist für manche von Interesse :)
quelle
Erste Aktivität:
Zweite Aktivität:
quelle
Sie können Daten zwischen Aktivitäten in der Anwendung auf drei Arten übergeben
Das absichtliche Übergeben von Daten hat eine gewisse Grenze. Für große Datenmengen können Sie die Datenfreigabe auf Anwendungsebene verwenden. Durch Speichern in SharedPreference wird die Größe Ihrer App erhöht
quelle
Verwenden Sie eine globale Klasse:
Sie können die Setter und Getter dieser Klasse aus allen anderen Klassen aufrufen. Wenn Sie dies tun, müssen Sie in jeder Aktivität ein GlobalClass-Objekt erstellen:
Dann können Sie zum Beispiel anrufen:
quelle