Question Comment transmettre des données entre des activités dans une application Android?


J'ai un scénario où, après s'être connecté via une page de connexion, il y aura une déconnexion button sur chaque activity.

En cliquant sign-out, Je vais passer le session id de l'utilisateur connecté pour vous déconnecter. Quelqu'un peut-il me guider sur la façon de garder session id disponible à tous activities?

Toute alternative à ce cas


1052
2018-01-19 06:06


origine


Réponses:


Le moyen le plus simple de le faire serait de transmettre l'identifiant de session à l'activité de déconnexion dans le Intent vous utilisez pour démarrer l'activité:

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

Accéder à cette intention sur l'activité suivante

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

le docs Pour Intents a plus d'informations (voir la section intitulée "Extras").


973
2018-01-19 06:12



Dans votre activité actuelle, créez une nouvelle Intent:

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

Ensuite, dans la nouvelle activité, récupérez ces valeurs:

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

Utilisez cette technique pour passer des variables d'une activité à l'autre.


1310
2017-09-06 19:41



Qui passe Intention extras est une bonne approche comme Erich l'a noté.

le Application l'objet est une autre façon de procéder, et il est parfois plus facile de traiter le même état sur plusieurs activités (par opposition à devoir le mettre / placer 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 là et y accéder à partir de toute 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 peut conduire à des fuites de mémoire. L'application aide à résoudre cela aussi.


120
2018-01-20 03:55



Classe de source:

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

Classe de destination (classe NewActivity):

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



Vous avez juste à envoyer des extras tout en appelant votre intention.

Comme ça:

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

Maintenant sur le OnCreate méthode de votre SecondActivity vous pouvez aller chercher les extras comme ça.

Si la valeur que vous avez envoyée était long:

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

Si la valeur que vous avez envoyée était String:

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

Si la valeur que vous avez envoyée était Boolean:

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

71
2018-05-24 11:26



Actualisé Notez que j'avais mentionné l'utilisation de SharedPreference. Il a une API simple et est accessible à travers les activités d'une application. Mais cette solution est maladroite et représente un risque de sécurité si vous transmettez des données sensibles. Il est préférable d'utiliser des intentions. Il a une liste étendue 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. Jettes un coup d'oeil à intention.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 lancer l'intention. Ce qui permet ensuite de configurer et de récupérer facilement les paramètres. Donc ça peut ressembler à ça

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, ...));
...

Ensuite, vous pouvez créer une intention pour l'activité prévue et vous assurer que vous avez tous les paramètres. Vous pouvez adapter pour les fragments à. Un exemple simple ci-dessus, mais vous avez l'idée.


37
2018-02-17 03:06



Essayez de faire ce qui suit:

Créez une classe "helper" simple (usine pour vos intentions), comme ceci:

import android.content.Intent;

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

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 devriez juste le dire comme ceci:

IntentHelper.createYourSpecialIntent(getIntent());

Dans votre activité Lorsque vous souhaitez "enregistrer" des données dans une "session", utilisez simplement ce qui suit:

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

Et envoyer cette intention. Dans l'activité cible, votre champ sera disponible comme:

getIntent().getStringExtra("YOUR_FIELD_NAME");

Alors maintenant, nous pouvons utiliser l'intention comme la même vieille session (comme dans les servlets ou JSP).


30
2018-01-19 07:16



Vous pouvez également passer des objets de classe personnalisés en effectuant un parcelable classe. La meilleure façon de le rendre parcelable est d'écrire votre classe et ensuite simplement le coller 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-

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

et obtenez le résultat dans NextActivity comme-

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

Maintenant, vous pouvez simplement utiliser le foo objet comme vous auriez utilisé.


22
2018-02-15 09:58



Cela m'aide à voir les choses dans leur contexte. Voici deux exemples.

Transmission de données en aval

enter image description here

Activité principale

  • Placez les données que vous souhaitez envoyer dans un Intention avec une paire clé-valeur. Voir cette réponse pour nommer les conventions pour la clé.
  • Commencer la deuxième activité avec startActivity.

MainActivity.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);
    }
}

Deuxième activité

  • Tu utilises getIntent() pour obtenir le Intent qui a commencé la deuxième activité. Ensuite, vous pouvez extraire les données avec getExtras() et la clé que vous avez définie dans la première activité. Puisque nos données sont une chaîne, nous allons simplement utiliser getStringExtra ici.

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

Passage des données

enter image description here

Activité principale

  • Commencer la deuxième activité avec startActivityForResult, en lui fournissant un code de résultat arbitraire.
  • Passer outre 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.)
  • Extraire les données que vous avez reçues de la déclaration 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 je vais utiliser le prédéfini Intent.EXTRA_TEXT puisque j'envoie du texte.

MainActivity.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);
            }
        }
    }
}

Deuxième activité

  • Mettez les données que vous souhaitez renvoyer à l'activité précédente dans un Intent. Les données sont stockées dans le Intent en utilisant une paire clé-valeur. J'ai choisi d'utiliser Intent.EXTRA_TEXT pour ma clé.
  • Définir le résultat à RESULT_OK et ajoutez l'intention de conserver vos données.
  • Appel finish() pour fermer la deuxième activité.

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



Une autre méthode consiste à utiliser un champ statique public dans lequel vous stockez des données, à savoir:

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

19
2017-10-25 22:34



Le moyen le plus pratique de transmettre des données entre les activités consiste à adopter des intentions. Dans la première activité d'où vous voulez envoyer des données, vous devez ajouter du code,

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

Vous devriez également importer

import android.content.Intent;

Ensuite, dans le prochain Acitvity (SecondActivity), vous devez récupérer les données de l'intention en utilisant le code suivant.

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

15
2017-08-27 06:46