Frage Wie gebe ich Daten zwischen Aktivitäten in einer Android-Anwendung weiter?


Ich habe ein Szenario, bei dem nach dem Einloggen über eine Login-Seite eine Abmeldung erfolgt button auf jeder activity.

Beim Klicken sign-outIch werde die session id des angemeldeten Benutzers zum Abmelden. Kann mir jemand Anleitung geben? session id für alle verfügbar activities?

Jede Alternative zu diesem Fall


1052
2018-01-19 06:06


Ursprung


Antworten:


Der einfachste Weg, dies zu tun, wäre, die Session ID an die Abmeldeaktivität in der Intent du benutzt um die Aktivität zu starten:

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

Greifen Sie auf diese Absicht für die nächste Aktivität zu

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

Das Dokumente Für Intents gibt es weitere Informationen (siehe Abschnitt "Extras").


973
2018-01-19 06:12



Erstellen Sie in Ihrer aktuellen Aktivität eine neue Aufgabe Intent:

String value="Hello world";
Intent i = new Intent(CurrentActivity.this, NewActivity.class);    
i.putExtra("key",value);
startActivity(i);

Dann in der neuen Aktivität diese Werte abrufen:

Bundle extras = getIntent().getExtras();
if (extras != null) {
    String value = extras.getString("key");
    //The key argument here must match that used in the other activity
}

Verwenden Sie diese Technik, um Variablen von einer Aktivität an die andere zu übergeben.


1310
2017-09-06 19:41



Vorbeigehen Absicht Extras ist ein guter Ansatz, wie Erich bemerkte.

Das Anwendung Das Objekt ist jedoch ein anderer Weg, und es ist manchmal einfacher, wenn man über mehrere Aktivitäten hinweg denselben Zustand behandelt (im Gegensatz dazu, dass man es überall hinbekommt), oder Objekte komplexer als Primitive und Strings.

Sie können die Anwendung erweitern und dann festlegen, was Sie dort haben wollen, und von jeder Aktivität (in derselben Anwendung) aus darauf zugreifen getApplication ().

Bedenken Sie auch, dass andere Ansätze, wie Statik, problematisch sein können kann zu Speicherlecks führen. Anwendung hilft auch, dies zu lösen.


120
2018-01-20 03:55



Quellklasse:

Intent myIntent = new Intent(this, NewActivity.class);
myIntent.putExtra("firstName", "Your First Name Here");
myIntent.putExtra("lastName", "Your Last Name Here");
startActivity(myIntent)

Zielklasse (NewActivity-Klasse):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view);

    Intent intent = getIntent();

    String fName = intent.getStringExtra("firstName");
    String lName = intent.getStringExtra("lastName");
}

78
2018-02-06 12:23



Sie müssen nur Extras senden, während Sie Ihre Absicht anrufen.

So was:

Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);

Jetzt auf der OnCreate Methode deines SecondActivity Sie können die Extras so holen.

Wenn der Wert, den du gesendet hast, in war long:

long value = getIntent().getLongExtra("Variable name which you sent as an extra", defaultValue(you can give it anything));

Wenn der Wert, den Sie gesendet haben, a war String:

String value = getIntent().getStringExtra("Variable name which you sent as an extra");

Wenn der Wert, den Sie gesendet haben, a war Boolean:

Boolean value = getIntent().getBooleanExtra("Variable name which you sent as an extra", defaultValue);

71
2018-05-24 11:26



Aktualisiert Beachten Sie, dass ich die Verwendung von erwähnt hatte SharedPreference. Es hat eine einfache API und ist über die Aktivitäten einer Anwendung zugänglich. Dies ist jedoch eine plumpe Lösung und stellt ein Sicherheitsrisiko dar, wenn sensible Daten weitergegeben werden. Es ist am besten, Absichten zu verwenden. Es verfügt über eine umfangreiche Liste von überladenen Methoden, die verwendet werden können, um viele verschiedene Datentypen zwischen Aktivitäten besser zu übertragen. Schau es dir an intent.putExtra. Dies Verknüpfung stellt die Verwendung von putExtra ziemlich gut dar.

Bei der Weitergabe von Daten zwischen Aktivitäten besteht meine bevorzugte Vorgehensweise 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 einfach Setup- und Abrufparameter. So kann es aussehen

public class MyActivity extends Activity {
    public static final String ARG_PARAM1 = "arg_param1";
...
public static getIntent(Activity from, String param1, Long param2...) {
    Intent intent = new Intent(from, MyActivity.class);
        intent.putExtra(ARG_PARAM1, param1);
        intent.putExtra(ARG_PARAM2, param2);
        return intent;
}

....
// Use it like this.
startActivity(MyActvitiy.getIntent(FromActivity.this, varA, varB, ...));
...

Dann können Sie eine Absicht für die beabsichtigte Aktivität erstellen und sicherstellen, dass Sie alle Parameter haben. Sie können sich an Fragmente anpassen. Ein einfaches Beispiel oben, aber Sie bekommen die Idee.


37
2018-02-17 03:06



Versuchen Sie Folgendes:

Erstelle eine einfache "Helfer" -Klasse (Fabrik für deine Absichten), so:

import android.content.Intent;

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

Dies wird die Fabrik für alle Ihre Intents sein. Jedes Mal, wenn Sie eine neue Absicht benötigen, erstellen Sie in IntentHelper eine statische Factory-Methode. Um eine neue Absicht zu erstellen, solltest du es einfach so sagen:

IntentHelper.createYourSpecialIntent(getIntent());

In deiner Aktivität. Wenn Sie einige Daten in einer "Sitzung" speichern möchten, verwenden Sie einfach Folgendes:

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

Und sende diese Absicht. In der Zielaktivität wird Ihr Feld wie folgt verfügbar sein:

getIntent().getStringExtra("YOUR_FIELD_NAME");

Jetzt können wir Intent wie die gleiche alte Sitzung verwenden (wie in Servlets oder JSP).


30
2018-01-19 07:16



Sie können benutzerdefinierte Klassenobjekte auch übergeben, indem Sie a parzellierbar Klasse. Der beste Weg, um es parzellierbar zu machen, besteht darin, Ihre Klasse zu schreiben und sie dann einfach auf eine Site wie z http://www.parcelafer.com/. Klicken Sie auf Build und Sie erhalten neuen Code. Kopieren Sie alles und ersetzen Sie den ursprünglichen Klasseninhalt. Dann-

Intent intent = new Intent(getBaseContext(), NextActivity.class);
Foo foo = new Foo();
intent.putExtra("foo", foo);
startActivity(intent);

und erhalten das Ergebnis in NextActivity like-

Foo foo = getIntent().getExtras().getParcelable("foo");

Jetzt können Sie einfach die foo Objekt wie du es benutzt hättest.


22
2018-02-15 09:58



Es hilft mir, die Dinge im Kontext zu sehen. Hier sind zwei Beispiele.

Weiterleiten von Daten

enter image description here

Hauptaktivität

  • Legen Sie die zu sendenden Daten mit einem Schlüssel / Wert-Paar in eine Absicht. Sehen diese Antwort zum Benennen von Konventionen für den Schlüssel.
  • Starten Sie die zweite Aktivität mit startActivity.

Hauptaktivität.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // get the text to pass
        EditText editText = (EditText) findViewById(R.id.editText);
        String textToPass = editText.getText().toString();

        // start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra(Intent.EXTRA_TEXT, textToPass);
        startActivity(intent);
    }
}

Zweite Aktivität

  • Sie nutzen getIntent() um das zu bekommen Intent Das hat die zweite Aktivität begonnen. Dann können Sie die Daten mit extrahieren getExtras() und der Schlüssel, den Sie in der ersten Aktivität definiert haben. Da unsere Daten eine Zeichenfolge sind, werden wir sie einfach verwenden getStringExtra Hier.

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        // get the text from MainActivity
        Intent intent = getIntent();
        String text = intent.getStringExtra(Intent.EXTRA_TEXT);

        // use the text in a TextView
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(text);
    }
}

Daten zurückgeben

enter image description here

Hauptaktivität

  • Starten Sie die zweite Aktivität mit startActivityForResultund liefert einen beliebigen Ergebniscode.
  • Überschreiben 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 aus derselben Hauptaktivität starten.)
  • Extrahieren Sie die Daten, die Sie von der Rückgabe erhalten haben 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 seit ich Text sende.

Hauptaktivität.java

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {

                // get String data from Intent
                String returnString = data.getStringExtra(Intent.EXTRA_TEXT);

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

Zweite Aktivität

  • Versetzen Sie die Daten, die Sie zurücksenden möchten, in die vorherige Aktivität Intent. Die Daten werden in der. Gespeichert Intent Verwenden eines Schlüssel / Wert-Paares. Ich entschied mich zu verwenden Intent.EXTRA_TEXT für meinen Schlüssel.
  • Setzen Sie das Ergebnis auf RESULT_OK und füge die Absicht hinzu, die deine Daten enthält.
  • Anruf finish() um die zweite Aktivität zu schließen.

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra(Intent.EXTRA_TEXT, stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

22
2017-08-31 10:35



Eine andere Möglichkeit besteht darin, ein öffentliches statisches Feld zu verwenden, in dem Sie Daten speichern, z.

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

19
2017-10-25 22:34