Pregunta ¿Cómo paso datos entre actividades en la aplicación de Android?


Tengo un escenario donde, después de iniciar sesión a través de una página de inicio de sesión, habrá un cierre de sesión button en cada activity.

Al hacer clic sign-out, Voy a pasar el session id del usuario registrado para cerrar la sesión. ¿Alguien puede guiarme sobre cómo mantener session id disponible para todos activities?

Cualquier alternativa a este caso


1052
2018-01-19 06:06


origen


Respuestas:


La forma más fácil de hacer esto sería pasar la identificación de la sesión a la actividad de registro en el Intent lo estás usando para comenzar la actividad:

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

Acceda a esa intención en la próxima actividad

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

los documentos para Intents tiene más información (consulte la sección titulada "Extras").


973
2018-01-19 06:12



En tu Actividad actual, crea una nueva Intent:

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

Luego, en la nueva Actividad, recupera esos valores:

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

Use esta técnica para pasar variables de una actividad a la otra.


1310
2017-09-06 19:41



Paso Intención extras es un buen enfoque, como señaló Erich.

los Solicitud Sin embargo, el objeto es otra manera, y a veces es más fácil cuando se trata del mismo estado en múltiples actividades (en lugar de tener que obtenerlo / ponerlo en todas partes) u objetos más complejos que las primitivas y las cadenas.

Puede extender la Aplicación, y luego establecer / obtener lo que quiera allí y acceder desde cualquier Actividad (en la misma aplicación) con getApplication ().

También tenga en cuenta que otros enfoques que podría ver, como la estática, pueden ser problemáticos porque puede conducir a pérdidas de memoria. La aplicación ayuda a resolver esto también.


120
2018-01-20 03:55



Clase de origen:

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

Clase de destino (clase 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



Solo tiene que enviar extras mientras llama a su intención.

Me gusta esto:

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

Ahora en el OnCreate método de su SecondActivity puedes buscar extras como este.

Si el valor que envió estaba en long:

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

Si el valor que envió fue un String:

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

Si el valor que envió fue un Boolean:

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

71
2018-05-24 11:26



Actualizado Tenga en cuenta que he mencionado el uso de SharedPreference. Tiene una API simple y es accesible a través de las actividades de una aplicación. Pero esta es una solución torpe, y es un riesgo de seguridad si pasa datos confidenciales. Lo mejor es usar intenciones. Tiene una extensa lista de métodos sobrecargados que se pueden utilizar para transferir mejor muchos tipos de datos diferentes entre actividades. Mira esto intent.putExtra. Esta enlazar presenta el uso de putExtra bastante bien.

Al pasar datos entre actividades, mi enfoque preferido es crear un método estático para la actividad relevante que incluye los parámetros requeridos para iniciar la intención. Que luego proporciona parámetros fáciles de configurar y recuperar. Entonces puede verse así

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

Luego puede crear un intento para la actividad prevista y asegurarse de tener todos los parámetros. Puedes adaptar los fragmentos a. Un simple ejemplo anterior, pero entiendes la idea.


37
2018-02-17 03:06



Intenta hacer lo siguiente:

Cree una clase simple de "ayuda" (fábrica para sus Intenciones), como esta:

import android.content.Intent;

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

Esta será la fábrica para todos sus Intents. Cada vez que necesite un nuevo Intento, cree un método de fábrica estático en IntentHelper. Para crear una nueva intención, solo debe decirlo así:

IntentHelper.createYourSpecialIntent(getIntent());

En tu actividad Cuando desee "guardar" algunos datos en una "sesión", solo use lo siguiente:

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

Y envía este Intento. En la Actividad objetivo, su campo estará disponible como:

getIntent().getStringExtra("YOUR_FIELD_NAME");

Entonces ahora podemos usar Intent como la misma sesión anterior (como en servlets o JSP)


30
2018-01-19 07:16



También puede pasar objetos personalizados de clase haciendo una parcelable clase. La mejor manera de hacerlo parcelable es escribir su clase y luego simplemente pegarla en un sitio como http://www.parcelabler.com/. Haga clic en compilar y obtendrá un nuevo código. Copie todo esto y reemplace el contenido de la clase original. Entonces-

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

y obtenga el resultado en NextActivity like-

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

Ahora puedes simplemente usar el foo objeto como lo habrías usado.


22
2018-02-15 09:58



Me ayuda a ver las cosas en contexto. Aquí hay dos ejemplos.

Pasar datos adelante

enter image description here

Actividad principal

  • Coloque los datos que desea enviar en una intención con un par clave-valor. Ver esta respuesta para nombrar convenciones para la clave.
  • Comience la segunda actividad con 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);
    }
}

Segunda actividad

  • Tu usas getIntent() para obtener el Intent eso comenzó la segunda actividad. Entonces puedes extraer los datos con getExtras() y la clave que definiste en la primera actividad. Dado que nuestros datos son una cadena, solo usaremos getStringExtra aquí.

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

Pasando datos de vuelta

enter image description here

Actividad principal

  • Comience la segunda actividad con startActivityForResult, siempre que sea un código de resultado arbitrario.
  • Anular onActivityResult. Esto se llama cuando termina la Segunda Actividad. Puede asegurarse de que en realidad sea la Segunda Actividad al verificar el código de resultado. (Esto es útil cuando se inician múltiples actividades diferentes desde la misma actividad principal).
  • Extraiga los datos que obtuvo de la devolución Intent. Los datos se extraen utilizando un par clave-valor. Podría usar cualquier cadena para la tecla pero usaré la predefinida Intent.EXTRA_TEXT ya que estoy enviando mensajes de texto

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

Segunda actividad

  • Coloque los datos que desea devolver a la actividad anterior en un Intent. Los datos se almacenan en Intent usando un par clave-valor. Elegí usar Intent.EXTRA_TEXT por mi llave
  • Establecer el resultado para RESULT_OK y agregue el intento que contiene sus datos.
  • Llamada finish() para cerrar la Segunda Actividad.

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



Otra forma es usar un campo público estático en el que almacene datos, es decir:

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

19
2017-10-25 22:34