android - tool - title tag




Wie gebe ich Daten zwischen Aktivitäten in einer Android-Anwendung weiter? (20)

Ergänzende Antwort: Namenskonventionen für die Schlüsselkette

Der tatsächliche 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 empfohlen , die EXTRA_* für standardisierte Datentypen zu verwenden.

Beispiel 1: Verwenden von Intent.EXTRA_* -Tasten

Erste Aktivität

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, "my text");
startActivity(intent);

Zweite Aktivität:

Intent intent = getIntent();
String myText = intent.getExtras().getString(Intent.EXTRA_TEXT);

Beispiel 2: Definieren Sie Ihren eigenen static final Endschlüssel

Wenn einer der Intent.EXTRA_* nicht Ihren Anforderungen entspricht, können Sie Ihre eigenen zu Beginn der ersten Aktivität definieren.

static final String EXTRA_STUFF = "com.myPackageName.EXTRA_STUFF";

Das Einschließen des Paketnamens ist nur eine Konvention, wenn Sie nur den Schlüssel in Ihrer eigenen App verwenden. Es ist jedoch notwendig, Namenskonflikte zu vermeiden, wenn Sie einen Dienst erstellen, den andere Apps mit einer Absicht aufrufen können.

Erste Aktivität:

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(EXTRA_STUFF, "my text");
startActivity(intent);

Zweite Aktivität:

Intent intent = getIntent();
String myText = intent.getExtras().getString(FirstActivity.EXTRA_STUFF);

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.

strings.xml

 <string name="EXTRA_STUFF">com.myPackageName.MY_NAME</string>

Erste Aktivität

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(getString(R.string.EXTRA_STUFF), "my text");
startActivity(intent);

Zweite Aktivität

Intent intent = getIntent();
String myText = intent.getExtras().getString(getString(R.string.EXTRA_STUFF));

Ich habe ein Szenario, in dem nach dem Anmelden über eine Anmeldeseite eine Abmeldeschaltfläche für jede activity .

Beim Abmelden gebe ich die session id des angemeldeten Benutzers an die Abmeldung weiter. Kann mir jemand sagen, wie ich die session id für alle activities verfügbar halten kann?

Jede Alternative zu diesem Fall


"Passing Intent Extras" ist ein guter Ansatz, wie Erich bemerkte.

Das Application ist jedoch eine andere Möglichkeit, und es ist manchmal einfacher, wenn derselbe Zustand über mehrere Aktivitäten hinweg behandelt wird (im Gegensatz zu dem, dass es überall benötigt wird) oder Objekte, die komplexer sind 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) mit getApplication() .

Denken Sie auch daran, dass andere Ansätze wie die Statik problematisch sein können, da sie zu Speicherlecks führen können . Anwendung hilft auch, dies zu lösen.


Der Standardansatz.

Intent i = new Intent(this, ActivityTwo.class);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
String getrec=textView.getText().toString();
Bundle bundle = new Bundle();
bundle.putString(“stuff”, getrec);
i.putExtras(bundle);
startActivity(i);

Rufen Sie jetzt in Ihrer zweiten Aktivität Ihre Daten aus dem Bündel ab:

Hol dir das Bündel

Bundle bundle = getIntent().getExtras();

Extrahiere die Daten ...

String stuff = bundle.getString(“stuff”); 

Der einfachste Weg dazu wäre, die Sitzungs-ID an die Abmeldeaktivität in der Intent Sie die Aktivität 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 s = getIntent().getStringExtra("EXTRA_SESSION_ID");

Die docs für Intents enthält weitere Informationen (siehe Abschnitt "Extras").


Die bequemste Methode zum Übergeben von Daten zwischen Aktivitäten besteht im Übergeben von Absichten. In der ersten Aktivität, von der Sie Daten senden möchten, sollten Sie Code hinzufügen,

String str = "My Data"; //Data you want to send
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("name",str); //Here you will add the data into intent to pass bw activites
v.getContext().startActivity(intent);

Sie sollten auch importieren

import android.content.Intent;

Dann sollten Sie im nächsten Acitvity (SecondActivity) die Daten aus der Absicht mithilfe des folgenden Codes abrufen.

String name = this.getIntent().getStringExtra("name");

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

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

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

Weiterleiten von Daten

Hauptaktivität

  • Legen Sie die Daten, die Sie senden möchten, mit einem Schlüssel / Wert-Paar in eine Absicht. In dieser Antwort finden Sie die Namenskonventionen 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 verwenden getIntent() , um den Intent , der die zweite Aktivität gestartet hat. Dann können Sie die Daten mit getExtras() und dem Schlüssel extrahieren, den Sie in der ersten Aktivität definiert haben. Da unsere Daten ein String sind, verwenden wir hier einfach getStringExtra .

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

Hauptaktivität

  • Starten Sie die zweite Aktivität mit 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 aus derselben Hauptaktivität starten.)
  • Extrahieren Sie die Daten, die Sie aus dem Return 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 den vordefinierten Intent.EXTRA_TEXT da 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

  • Legen Sie die Daten, die Sie an die vorherige Aktivität senden möchten, in eine Intent . Die Daten werden in der Intent Verwendung eines Schlüssel / Wert-Paares gespeichert. Ich habe Intent.EXTRA_TEXT für meinen Schlüssel verwendet.
  • Setzen Sie das Ergebnis auf RESULT_OK und fügen Sie die Absicht hinzu, die Ihre Daten enthält.
  • Rufen Sie finish() auf, um die zweite Aktivität zu finish() .

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();
    }
}

Hier ist meine Best Practice und es hilft sehr, wenn das Projekt riesig und komplex ist.

Angenommen, ich habe zwei Aktivitäten, LoginActivity und HomeActivity . Ich möchte 2 Parameter (Benutzername und Passwort) von LoginActivity an HomeActivity .

Zuerst erstelle ich meinen HomeIntent

public class HomeIntent extends Intent {

    private static final String ACTION_LOGIN = "action_login";
    private static final String ACTION_LOGOUT = "action_logout";

    private static final String ARG_USERNAME = "arg_username";
    private static final String ARG_PASSWORD = "arg_password";


    public HomeIntent(Context ctx, boolean isLogIn) {
        this(ctx);
        //set action type
        setAction(isLogIn ? ACTION_LOGIN : ACTION_LOGOUT);
    }

    public HomeIntent(Context ctx) {
        super(ctx, HomeActivity.class);
    }

    //This will be needed for receiving data
    public HomeIntent(Intent intent) {
        super(intent);
    }

    public void setData(String userName, String password) {
        putExtra(ARG_USERNAME, userName);
        putExtra(ARG_PASSWORD, password);
    }

    public String getUsername() {
        return getStringExtra(ARG_USERNAME);
    }

    public String getPassword() {
        return getStringExtra(ARG_PASSWORD);
    }

    //To separate the params is for which action, we should create action
    public boolean isActionLogIn() {
        return getAction().equals(ACTION_LOGIN);
    }

    public boolean isActionLogOut() {
        return getAction().equals(ACTION_LOGOUT);
    }
}

So gebe ich die Daten in meiner LoginActivity weiter

public class LoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        String username = "phearum";
        String password = "pwd1133";
        final boolean isActionLogin = true;
        //Passing data to HomeActivity
        final HomeIntent homeIntent = new HomeIntent(this, isActionLogin);
        homeIntent.setData(username, password);
        startActivity(homeIntent);

    }
}

HomeActivity Schritt, hier ist, wie ich die Daten in HomeActivity

public class HomeActivity extends AppCompatActivity {

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

        //This is how we receive the data from LoginActivity
        //Make sure you pass getIntent() to the HomeIntent constructor
        final HomeIntent homeIntent = new HomeIntent(getIntent());
        Log.d("HomeActivity", "Is action login?  " + homeIntent.isActionLogIn());
        Log.d("HomeActivity", "username: " + homeIntent.getUsername());
        Log.d("HomeActivity", "password: " + homeIntent.getPassword());
    }
}

Erledigt! Cool :) Ich möchte nur meine Erfahrungen teilen. Wenn Sie an kleinen Projekten arbeiten, sollte dies nicht das große Problem sein. Aber wenn Sie an einem großen Projekt arbeiten, tut es wirklich weh, wenn Sie Fehler korrigieren oder beheben wollen.


Ich verwende statische Felder in einer Klasse und erhalte / setze sie:

Mögen:

public class Info
{
    public static int ID      = 0;
    public static String NAME = "TEST";
}

Um einen Wert zu erhalten, verwende diesen in einer Aktivität:

Info.ID
Info.NAME

Zum Einstellen eines Wertes:

Info.ID = 5;
Info.NAME = "USER!";

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");
}

Sie können Daten zwischen Aktivitäten senden, indem Sie das Intent-Objekt verwenden. Bedenken Sie, dass Sie zwei Aktivitäten haben, nämlich FirstActivity und SecondActivity .

Inside FirstActivity:

Absicht verwenden:

i = new Intent(FirstActivity.this,SecondActivity.class);
i.putExtra("key", value);
startActivity(i)

Innerhalb von SecondActivity

Bundle bundle= getIntent().getExtras();

Jetzt können Sie verschiedene Methoden der Bundle-Klasse verwenden, um Werte von FirstActivity by Key zu erhalten.

ZB bundle.getString("key") , bundle.getDouble("key") , bundle.getInt("key") usw.


Sie können Shared Preference versuchen, es kann eine gute Alternative für das Freigeben von Daten zwischen den Aktivitäten sein

Session-ID speichern -

SharedPreferences pref = myContexy.getSharedPreferences("Session 
Data",MODE_PRIVATE);
SharedPreferences.Editor edit = pref.edit();
edit.putInt("Session ID", session_id);
edit.commit();

Um sie zu bekommen -

SharedPreferences pref = myContexy.getSharedPreferences("Session Data", MODE_PRIVATE);
session_id = pref.getInt("Session ID", 0);

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 können Sie die Extras auf der OnCreate Methode Ihrer SecondActivity wie OnCreate SecondActivity .

Wenn der von Ihnen gesendete Wert 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, ein String :

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

Wenn der von Ihnen gesendete Wert ein Boolean Wert ist :

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

Versuche dies:

AktuelleAktivität.java

Intent intent = new Intent(currentActivity.this, TargetActivity.class);
intent.putExtra("booktype", "favourate");
startActivity(intent);

ZielAktivität.java

Bundle b = getIntent().getExtras();
String typesofbook = b.getString("booktype");

Wenn Sie eine Bitmap zwischen Activites / Fragments übertragen möchten

Aktivität

Um eine Bitmap zwischen Activites zu übergeben

Intent intent = new Intent(this, Activity.class);
intent.putExtra("bitmap", bitmap);

Und in der Aktivitätsklasse

Bitmap bitmap = getIntent().getParcelableExtra("bitmap");

Fragment

Um eine Bitmap zwischen Fragmenten zu übergeben

SecondFragment fragment = new SecondFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap);
fragment.setArguments(bundle);

Um innerhalb des SecondFragment zu erhalten

Bitmap bitmap = getArguments().getParcelable("bitmap");

Große Bitmaps übertragen

Wenn Sie eine fehlgeschlagene Bindertransaktion erhalten, bedeutet dies, dass Sie den Bindertransaktionspuffer ü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 Array eines Bytes komprimieren und dann in einer anderen Aktivität wie dieser dekomprimieren

In der FirstActivity

Intent intent = new Intent(this, SecondActivity.class);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPG, 100, stream);
byte[] bytes = stream.toByteArray(); 
intent.putExtra("bitmapbytes",bytes);

Und in der SecondActivity

byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

Aktualisiert Hinweis: Ich hatte die Verwendung von 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. intent.putExtra Sie einen Blick auf intent.putExtra . Dieser link stellt die Verwendung von putExtra sehr 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.


If you use kotlin:

In MainActivity1:

var intent=Intent(this,MainActivity2::class.java)
intent.putExtra("EXTRA_SESSION_ID",sessionId)
startActivity(intent)

In MainActivity2:

if (intent.hasExtra("EXTRA_SESSION_ID")){
    var name:String=intent.extras.getString("sessionId")
}

There are multiple ways to pass data between activities, and the documentation has many of them.

For most cases, Intent.putExtras is enough.


You can use Intent

Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);

Another way you can use singleton pattern also:

public class DataHolder {

private static DataHolder dataHolder;
private List<Model> dataList;

public void setDataList(List<Model>dataList) {
    this.dataList = dataList;
}

public List<Model> getDataList() {
    return dataList;
}

public synchronized static DataHolder getInstance() {
    if (dataHolder == null) {
       dataHolder = new DataHolder();
    }
    return dataHolder;
}

}

From your FirstActivity

private List<Model> dataList = new ArrayList<>();
DataHolder.getInstance().setDataList(dataList);

On SecondActivity

private List<Model> dataList = DataHolder.getInstance().getDataList();

/*
 * If you are from transferring data from one class that doesn't
 * extend Activity, then you need to do something like this.
 */ 

public class abc {
    Context context;

    public abc(Context context) {
        this.context = context;
    }

    public void something() {
        context.startactivity(new Intent(context, anyone.class).putextra("key", value));
    }
}






android-activity