¿Cómo paso datos entre actividades en la aplicación de Android?
Frecuentes
Visto 1,034 veces
1405
Tengo un escenario en el que, 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
, Estaré pasando el session id
del usuario que inició sesión para cerrar la sesión. ¿Alguien puede guiarme sobre cómo mantener session id
disponible para todos activities
?
Cualquier alternativa a este caso
30 Respuestas
1362
La forma más sencilla de hacer esto sería pasar el ID de sesión a la actividad de cierre de sesión en el Intent
que está utilizando para iniciar 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");
EL documentos for Intents tiene más información (consulte la sección titulada "Extras").
contestado el 25 de mayo de 19 a las 10:05
ok, si paso el ID de sesión para cerrar la actividad en el inicio de sesión exitoso y ¿funcionará en cualquier página de actividad para cerrar sesión o manualmente tendré que asignarle un valor a cada actividad? usando el procedimiento anterior? - SOLUCIONES UMAR-MOBIT
Sí, tendría que hacer que el ID de sesión esté disponible para todas las actividades en las que desee permitir que el usuario cierre sesión. Alternativamente, puede almacenarlo en el objeto Aplicación, pero luego tendrá que administrar el estado de la sesión (verifique si es válido antes de usarlo, etc.). - erich douglas
Tenga en cuenta que la documentación señala lo siguiente: Agregue datos extendidos a la intención. El nombre debe incluir un prefijo de paquete, por ejemplo, la aplicación com.android.contacts usaría nombres como "com.android.contacts.ShowAll". - serguei fedorov
Y para leer datos de otro uso de actividad Long session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
- Farid
¿Cómo podemos pasar datos usando setData
y ¿cuál es la diferencia entre estos dos enfoques? ¿Cuál es mejor? - Hosein Aqajani
1422
En su actividad actual, cree 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, recupere 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
}
Utilice esta técnica para pasar variables de una actividad a otra.
respondido 25 mar '18, 07:03
Solo una información para aquellos que son tan ciegos como yo: si pones un número entero en tu actividad actual, debes obtenerlo en la nueva a través de extras.getInt("new_variable_name")
. Si intentas conseguirlo a través de getString()
¡Android ve que se dio un int y devuelve nulo! - bish
¿Qué pasa si la actividad ya se está ejecutando? ¿Es necesario hacer startActivity(i);
? Quiero decir, puedo hacer actividad A llamar al actividad B, y eso devuelve datos a actividad A ? estoy confundido? - Francisco Corrales Morales
Prefiero la variable de cadena. Siempre puede convertir una cadena en entero o flotante más tarde. - user914425
144
Pasando (Paso) Intención extras es un buen enfoque, como señaló Erich.
EL Solicitud Sin embargo, el objeto es de 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 los primitivos y las cadenas.
Puede extender la Aplicación, y luego configurar / obtener lo que desee allí y acceder a ella desde cualquier Actividad (en la misma aplicación) con getApplication ().
También tenga en cuenta que otros enfoques que puede ver, como la estática, pueden ser problemáticos porque puede provocar pérdidas de memoria. La aplicación también ayuda a resolver esto.
Respondido el 26 de enero de 10 a las 17:01
+1 para el problema de estática. probablemente la limpieza se pueda resolver combinando un singleton con la clase de aplicación del método onCreate / onTerminate. - sur
Oye, sé que este hilo fue hace bastante tiempo, pero el enlace proporcionado ahora es un callejón sin salida. ¿Hay algún lugar donde pueda encontrar el ejemplo? - Jugo
¿Cómo lograr esto usando la aplicación? @CharlieCollins - Banee Ishaque K
Aquí hay un ejemplo actualizado de esto aquí, de un libro muy antiguo :) github.com/charlieCollins/android-en-practica/blob/master/ch07/… - charlie collins
@JuiCe La publicación del blog de desarrolladores de Android sobre pérdidas de memoria ya no es válida. - Edric
97
Clase de fuente:
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");
}
respondido 22 nov., 15:12
¿Puede la intención ser nula alguna vez? ¿Debemos comprobar que no sea nulo? - Micro
Este es un duplicado del 3 años mayor. respuesta más votada y de La respuesta de Sahil Mahajan Mj y de La respuesta de Mayank Saini - Múrmel
86
Solo tiene que enviar extras mientras llama a su intención.
Me gusta:
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);
En la OnCreate
método de su SecondActivity
puedes buscar los extras de esta manera.
Si el valor que enviaste 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);
Respondido el 14 de Septiembre de 16 a las 04:09
Tenga en cuenta que la documentación señala lo siguiente: Agregue datos extendidos a la intención. El nombre debe incluir un prefijo de paquete, por ejemplo, la aplicación com.android.contacts usaría nombres como "com.android.contacts.ShowAll". - serguei fedorov
Este es un duplicado de la respuesta más votada que ha estado allí durante 2 años antes de esta respuesta y de La respuesta de Sahil Mahajan Mj que es 1 año mayor. Única diferencia: ejemplos de boolean
y long
captadores que vale la pena un comentario en mi opinión, no una respuesta. - Múrmel
54
Me ayuda a ver las cosas en contexto. A continuación se muestran dos ejemplos.
Pasar datos hacia adelante
Actividad principal
- Coloque los datos que desea enviar en un Intent con un par clave-valor. Ver esta respuesta para nombrar convenciones para la clave.
- Inicie 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 elIntent
que inició la segunda actividad. Entonces puedes extraer los datos congetExtras()
y la clave que definiste en la primera actividad. Dado que nuestros datos son una cadena, solo usaremosgetStringExtra
aquí.
Segunda Actividad.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
Actividad principal
- Inicie la segunda actividad con
startActivityForResult
, proporcionándole un código de resultado arbitrario. - Anular
onActivityResult
. Esto se llama cuando finaliza la Segunda Actividad. Puede asegurarse de que en realidad sea la Segunda actividad comprobando el código de resultado. (Esto es útil cuando está iniciando varias actividades diferentes desde la misma actividad principal). - Extrae los datos que obtuviste de la devolución
Intent
. Los datos se extraen mediante un par clave-valor. Podría usar cualquier cadena para la clave, pero usaré el predefinidoIntent.EXTRA_TEXT
ya que estoy enviando un mensaje 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 enviar a la actividad anterior en un
Intent
. Los datos se almacenan en elIntent
utilizando un par clave-valor. Elegí usarIntent.EXTRA_TEXT
por mi llave. - Establezca el resultado en
RESULT_OK
y agregue la intención que contiene sus datos. - Llame a
finish()
para cerrar la Segunda Actividad.
Segunda Actividad.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();
}
}
Respondido el 17 de enero de 18 a las 17:01
¡Wow gracias! Esto era exactamente lo que estaba buscando. Está bastante claro cuando uso la cámara u otros elementos externos que espero obtener resultados, pero no pensé en usarlo internamente. Eres el primero en decirlo tan abiertamente. - user3195231
46
Actualizado Tenga en cuenta que he mencionado el uso de Preferencia compartida. 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 para la seguridad si transmite datos confidenciales. Es mejor usar intenciones. Tiene una lista extensa de métodos sobrecargados que se pueden usar para transferir mejor muchos tipos de datos diferentes entre actividades. Mira esto intención.putExtra. Esto aquí presenta bastante bien el uso de putExtra.
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 lanzar la intención. Que luego proporciona configuraciones y recupera parámetros fácilmente. 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 una intención para la actividad prevista y asegurarse de tener todos los parámetros. Puede adaptarse a los fragmentos. Un simple ejemplo anterior, pero ya entiendes la idea.
Respondido el 14 de diciembre de 17 a las 00:12
Me gusta más tu respuesta ... Pasarla a través de la intención significa que en casi todos los lugares donde empiezo una actividad, tendrás que recordar incluir el sessionId. Al colocarlo en SharedPreferences, puede obtenerlo en cualquier momento desde cualquier actividad. : 0) - doblador de bytes
@bytebender Sé que esto es un poco tarde para la respuesta, agradezco que te guste mi respuesta original por su simplicidad, pero tendría cuidado de almacenar la ID de sesión en preferencias compartidas. Si debe almacenarlo en un almacenamiento duro, utilice el cifrado. Si puede usar un marco de autenticación que emplea JWT, incluirá refreshTokens que son más seguros para el almacenamiento a largo plazo y luego mantendrá el token de sesión actual como una propiedad pública de un objeto de aplicación personalizado para acceder fácilmente a los tokens de autenticación y reducir la sobrecarga en la actividad. firmas de intención. - chico enojado
39
Trate de hacer lo siguiente:
Cree una clase de "ayudante" simple (fábrica para sus Intents), 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 de todos tus Intents. Cada vez que necesite un nuevo Intent, cree un método de fábrica estático en IntentHelper. Para crear un nuevo Intent, debes decirlo así:
IntentHelper.createYourSpecialIntent(getIntent());
En tu actividad. Cuando desee "guardar" algunos datos en una "sesión", utilice lo siguiente:
IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);
Y envía este Intent. En la Actividad de destino, 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).
respondido 22 mar '17, 18:03
29
También puede pasar objetos de clase personalizados haciendo un 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 original de la clase. Luego-
Intent intent = new Intent(getBaseContext(), NextActivity.class);
Foo foo = new Foo();
intent.putExtra("foo", foo);
startActivity(intent);
y obtener el resultado en NextActivity como-
Foo foo = getIntent().getExtras().getParcelable("foo");
Ahora puedes simplemente usar el foo objeto como lo hubieras usado.
Respondido el 23 de enero de 17 a las 15:01
22
Otra forma es utilizar un campo estático público en el que almacena datos, es decir:
public class MyActivity extends Activity {
public static String SharedString;
public static SomeObject SharedObject;
//...
Respondido 25 Oct 12, 23:10
Realmente me pregunto por qué su sugerencia no obtuvo votos, es más simple y más práctica. - Porizm
um ... ¿esto no viola los principios de OO? - Cristian Vielma
@ChristianVielma bueno, es más como un área gris ... puedes hacerlo de muchas maneras, para mí parece una "escapada" limpia, así que ... depende de ti (el desarrollador) tomar la decisión si funciona bien para ti o no, me gusta así porque es más fácil de seguir, pero se puede ensuciar muy rápido ... - user497849
¿Por qué dices que esto se ensucia? ¿IOS no hace esto para pasar datos entre controladores de vista estableciendo "propiedades" que es similar a esto? Esto es mucho más fácil que usar intenciones. terry bu
Sí, pasa datos entre controladores de vista, pero no con estático propiedades. El problema es que no es una propiedad en la instancia de actividad deseada. La forma en que Android lanza actividades a través de startActivity (), no crea una instancia instantánea del objeto y permite al desarrollador establecer una variable de instancia. Es bastante molesto ... - Shawn
20
La forma más conveniente de pasar datos entre actividades es pasando intenciones. En la primera actividad desde donde desea enviar datos, debe agregar código,
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);
También deberías importar
import android.content.Intent;
Luego, en la siguiente actividad (SecondActivity), debe recuperar los datos de la intención utilizando el siguiente código.
String name = this.getIntent().getStringExtra("name");
respondido 22 nov., 15:10
Este es un duplicado del respuesta más votada que ha estado allí incluso durante 1 año más. - Múrmel
19
Puedes usar SharedPreferences
...
Inicio sesión. ID de sesión del almacén de tiempo en
SharedPreferences
SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE); Editor editor = preferences.edit(); editor.putString("sessionId", sessionId); editor.commit();
Desconectar. ID de sesión de recuperación de tiempo en preferencias compartidas
SharedPreferences preferences = getSharedPreferences("session", getApplicationContext().MODE_PRIVATE); String sessionId = preferences.getString("sessionId", null);
Si no tiene el ID de sesión requerido, elimine las preferencias compartidas:
SharedPreferences settings = context.getSharedPreferences("session", Context.MODE_PRIVATE);
settings.edit().clear().commit();
Eso es muy útil, porque una vez se guarda el valor y luego se recupera en cualquier lugar de la actividad.
respondido 22 nov., 15:12
17
El enfoque estándar.
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);
Ahora, en su segunda actividad, recupere sus datos del paquete:
Consigue el paquete
Bundle bundle = getIntent().getExtras();
Extrae los datos ...
String stuff = bundle.getString(“stuff”);
Respondido el 28 de enero de 15 a las 12:01
Duplicar como ya lo propuso PRABEESH RK en 2012. Y podría reducirse a la i.putExtras()
/getIntent().getString()
que es propuesto por otras 6 respuestas ... - Múrmel
17
De actividad
int n= 10;
Intent in = new Intent(From_Activity.this,To_Activity.class);
Bundle b1 = new Bundle();
b1.putInt("integerNumber",n);
in.putExtras(b1);
startActivity(in);
A la actividad
Bundle b2 = getIntent().getExtras();
int m = 0;
if(b2 != null)
{
m = b2.getInt("integerNumber");
}
Respondido el 24 de enero de 18 a las 15:01
11
Puede enviar datos entre actividades utilizando el objeto de intención. Considere que tiene dos actividades a saber FirstActivity
y SecondActivity
.
Dentro de FirstActivity:
Usando Intent:
i = new Intent(FirstActivity.this,SecondActivity.class);
i.putExtra("key", value);
startActivity(i)
Dentro de SecondActivity
Bundle bundle= getIntent().getExtras();
Ahora puede usar diferentes métodos de clase de paquete para obtener valores pasados de FirstActivity por Key.
P.ej
bundle.getString("key")
,bundle.getDouble("key")
,bundle.getInt("key")
etc.
Respondido el 07 de enero de 16 a las 07:01
Duplicar: El Bundle
enfoque basado ya fue propuesto por PRABEESH RK en 2012 y Ajay Venugopal. Y podría reducirse a la i.putExtras()
/getIntent().getString()
que es propuesto por otras 7 respuestas ... - Múrmel
11
Si desea transferir mapa de bits entre actividades / fragmentos
Actividad
Para pasar un mapa de bits entre actividades
Intent intent = new Intent(this, Activity.class);
intent.putExtra("bitmap", bitmap);
Y en la clase de actividad
Bitmap bitmap = getIntent().getParcelableExtra("bitmap");
fragmento
Para pasar un mapa de bits entre fragmentos
SecondFragment fragment = new SecondFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap);
fragment.setArguments(bundle);
Para recibir dentro del SecondFragment
Bitmap bitmap = getArguments().getParcelable("bitmap");
Transferencia de mapas de bits grandes
Si obtiene una transacción de carpeta fallida, esto significa que está excediendo el búfer de transacción de carpeta al transferir un elemento grande de una actividad a otra.
Entonces, en ese caso, debe comprimir el mapa de bits como una matriz de bytes y luego descomprimirlo en otra actividad, Me gusta esto
En la primera actividad
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);
Y en la Segunda Actividad
byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Respondido el 22 de enero de 16 a las 07:01
9
Intent intent = new Intent(YourCurrentActivity.this, YourActivityName.class);
intent.putExtra("NAme","John");
intent.putExtra("Id",1);
startActivity(intent);
Puede recuperarlo en otra actividad. Dos caminos:
int id = getIntent.getIntExtra("id", /* defaltvalue */ 2);
La segunda forma es:
Intent i = getIntent();
String name = i.getStringExtra("name");
respondido 22 nov., 15:12
Este es un duplicado del 3 años mayor. respuesta más votada y de La respuesta de Sahil Mahajan Mj y de La respuesta de Mayank Saini y La respuesta de Md. Rahman - Múrmel
8
Esta es mi mejor práctica y ayuda mucho cuando el proyecto es enorme y complejo.
Supongamos que tengo 2 actividades, LoginActivity
y HomeActivity
. Quiero pasar 2 parámetros (nombre de usuario y contraseña) de LoginActivity
a HomeActivity
.
Primero, creo mi 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);
}
}
Así es como paso los datos en mi actividad de inicio de sesión
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);
}
}
Paso final, así es como recibo los datos en 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());
}
}
¡Hecho! Genial :) Solo quiero compartir mi experiencia. Si trabaja en un proyecto pequeño, este no debería ser el gran problema. Pero cuando estás trabajando en un gran proyecto, es realmente doloroso cuando quieres refactorizar o corregir errores.
Respondido 02 Abr '18, 10:04
7
Respuesta complementaria: convenciones de nomenclatura para la cadena de claves
El proceso real de pasar datos ya ha sido respondido, sin embargo, la mayoría de las respuestas usan cadenas codificadas para el nombre de la clave en el Intent. Por lo general, esto está bien cuando se usa solo dentro de su aplicación. sin embargo, el la documentación recomienda usando el EXTRA_*
constantes para tipos de datos estandarizados.
Ejemplo 1: uso Intent.EXTRA_*
claves
Primera actividad
Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, "my text");
startActivity(intent);
Segunda actividad:
Intent intent = getIntent();
String myText = intent.getExtras().getString(Intent.EXTRA_TEXT);
Ejemplo 2: Definiendo el tuyo propio static final
clave
Si uno de los Intent.EXTRA_*
Las cadenas no se adaptan a sus necesidades, puede definir las suyas propias al comienzo de la primera actividad.
static final String EXTRA_STUFF = "com.myPackageName.EXTRA_STUFF";
Incluir el nombre del paquete es solo una convención si solo usa la clave en su propia aplicación. Pero es una necesidad evitar conflictos de nombres si está creando algún tipo de servicio al que otras aplicaciones puedan llamar con una intención.
Primera actividad:
Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(EXTRA_STUFF, "my text");
startActivity(intent);
Segunda actividad:
Intent intent = getIntent();
String myText = intent.getExtras().getString(FirstActivity.EXTRA_STUFF);
Ejemplo 3: uso de una clave de recurso de cadena
Aunque no se menciona en la documentación, esta respuesta recomienda usar un recurso String para evitar dependencias entre actividades.
strings.xml
<string name="EXTRA_STUFF">com.myPackageName.MY_NAME</string>
Primera actividad
Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(getString(R.string.EXTRA_STUFF), "my text");
startActivity(intent);
Segunda actividad
Intent intent = getIntent();
String myText = intent.getExtras().getString(getString(R.string.EXTRA_STUFF));
Respondido el 20 de junio de 20 a las 10:06
7
Kotlin
Pase de la primera actividad
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)
Entra en la segunda actividad
val value = intent.getStringExtra("key")
Sugerencia
Siempre coloque las claves en un archivo constante para una forma más administrada.
companion object {
val KEY = "key"
}
Respondido el 18 de enero de 21 a las 03:01
val value = intent.getStringExtra ("clave") - JASKIER
6
El paso de datos entre actividades se realiza principalmente mediante un objeto de intención.
Primero debe adjuntar los datos al objeto de intención con el uso del Bundle
clase. Luego llame a la actividad usando startActivity()
or startActivityForResult()
métodos.
Puede encontrar más información al respecto, con un ejemplo de la publicación del blog. Pasar datos a una actividad.
respondido 22 nov., 15:10
Es más o menos el mismo como usando el Intención proporcionó métodos directamente (Intent#putExtra()
). Pero agrega otro Bundle
y complica las cosas. - Múrmel
6
Puede probar Shared Preference, puede ser una buena alternativa para compartir datos entre las actividades
Para guardar la identificación de la sesión:
SharedPreferences pref = myContexy.getSharedPreferences("Session
Data",MODE_PRIVATE);
SharedPreferences.Editor edit = pref.edit();
edit.putInt("Session ID", session_id);
edit.commit();
Para conseguirlos -
SharedPreferences pref = myContexy.getSharedPreferences("Session Data", MODE_PRIVATE);
session_id = pref.getInt("Session ID", 0);
contestado el 04 de mayo de 17 a las 12:05
Duplicado: este enfoque ya fue propuesto por Ravi Parsania en 2014 - Múrmel
6
Puedes usar Intent
Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);
Otra forma podría ser usar patrón singleton también:
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;
}
}
De tu primera actividad
private List<Model> dataList = new ArrayList<>();
DataHolder.getInstance().setDataList(dataList);
En SecondActivity
private List<Model> dataList = DataHolder.getInstance().getDataList();
contestado el 31 de mayo de 18 a las 23:05
Duplicado: el enfoque de intención ya ha sido propuesto por respuesta más votada y de La respuesta de Sahil Mahajan Mj y de La respuesta de Mayank Saini y La respuesta de Md. Rahman, La respuesta de Dilavar M, respuesta del desarrollador de Android, sahulab. Singleton: Rodion Altshuler respuesta - Múrmel
5
Iniciar otra actividad desde esta actividad pasar parámetros a través de Bundle Object
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "xyz@gmail.com");
startActivity(intent);
Recuperar en otra actividad (YourActivity)
String s = getIntent().getStringExtra("USER_NAME");
Esto está bien para tipos de datos de tipo simple. Pero si desea pasar datos complejos entre actividades, primero debe serializarlos.
Aquí tenemos Modelo de empleado
class Employee{
private String empId;
private int age;
print Double salary;
getters...
setters...
}
Puede usar Gson lib proporcionada por Google para serializar los datos complejos como este
String strEmp = new Gson().toJson(emp);
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("EMP", strEmp);
startActivity(intent);
Bundle bundle = getIntent().getExtras();
String empStr = bundle.getString("EMP");
Gson gson = new Gson();
Type type = new TypeToken<Employee>() {
}.getType();
Employee selectedEmp = gson.fromJson(empStr, type);
Respondido 12 Jul 17, 22:07
5
Primera forma: en su actividad actual, cuando crea un objeto de intención para abrir una nueva pantalla:
String value="xyz";
Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
intent.putExtra("key", value);
startActivity(intent);
Luego, en el método nextActivity in onCreate, recupere los valores que pasa de la actividad anterior:
if (getIntent().getExtras() != null) {
String value = getIntent().getStringExtra("key");
//The key argument must always match that used send and retrive value from one activity to another.
}
Segunda forma: puede crear un objeto de paquete y poner valores en un paquete y luego poner el objeto de paquete en la intención de su actividad actual -
String value="xyz";
Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
Bundle bundle = new Bundle();
bundle.putInt("key", value);
intent.putExtra("bundle_key", bundle);
startActivity(intent);
Luego, en el método nextActivity in onCreate, recupere los valores que pasa de la actividad anterior:
if (getIntent().getExtras() != null) {
Bundle bundle = getIntent().getStringExtra("bundle_key");
String value = bundle.getString("key");
//The key argument must always match that used send and retrive value from one activity to another.
}
También puede utilizar la clase bean para pasar datos entre clases mediante la serialización.
Respondido el 25 de diciembre de 20 a las 12:12
4
/*
* 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));
}
}
Respondido 24 Abr '15, 22:04
4
Recientemente lancé API de vapor, un marco de Android con sabor a jQuery que simplifica todo tipo de tareas como esta. Como se mencionó, SharedPreferences
es una forma de hacer esto.
VaporSharedPreferences
se implementa como Singleton, por lo que es una opción, y en Vapor API tiene una sobrecarga .put(...)
método para que no tenga que preocuparse explícitamente por el tipo de datos que está confirmando, siempre que sea compatible. También es fluido, por lo que puede encadenar llamadas:
$.prefs(...).put("val1", 123).put("val2", "Hello World!").put("something", 3.34);
También, opcionalmente, guarda automáticamente los cambios y unifica el proceso de lectura y escritura bajo el capó para que no necesite recuperar explícitamente un editor como lo hace en Android estándar.
Alternativamente, puede usar un Intent
. En Vapor API también puedes usar el encadenable sobrecargado .put(...)
método en un VaporIntent
:
$.Intent().put("data", "myData").put("more", 568)...
Y páselo como un extra, como se menciona en las otras respuestas. Puede recuperar extras de su Activity
y, además, si está utilizando VaporActivity
esto se hace automáticamente para que pueda usar:
this.extras()
Para recuperarlos en el otro extremo en el Activity
al que cambia.
Espero que sea de interés para algunos :)
Respondido 02 Abr '18, 10:04
@BaneeIshaqueK sí lo siento, no he mantenido esto por un tiempo. Tener un enlace actualizado para apuntar directamente al Github para el proyecto en caso de que ayude. PD. No estoy seguro de lo que estaba pensando para esa licencia ... disculpas - Darío
4
Primera actividad:
Intent intent = new Intent(getApplicationContext(), ClassName.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);
Segunda actividad:
String str= getIntent().getStringExtra("Variable name which you sent as an extra");
Respondido 23 Jul 18, 08:07
3
Utilice una clase global:
public class GlobalClass extends Application
{
private float vitamin_a;
public float getVitaminA() {
return vitamin_a;
}
public void setVitaminA(float vitamin_a) {
this.vitamin_a = vitamin_a;
}
}
Puede llamar a los setters y getters de esta clase desde todas las demás clases. Haga eso, necesita hacer un GlobalClass-Object en cada Actitity:
GlobalClass gc = (GlobalClass) getApplication();
Entonces puedes llamar por ejemplo:
gc.getVitaminA()
Respondido el 15 de enero de 15 a las 17:01
Aplicación anulada: es un duplicado de La respuesta de quien - Múrmel
3
Utilizo campos estáticos en una clase y los obtengo / configuro:
Me gusta:
public class Info
{
public static int ID = 0;
public static String NAME = "TEST";
}
Para obtener un valor, use esto en una actividad:
Info.ID
Info.NAME
Para establecer un valor:
Info.ID = 5;
Info.NAME = "USER!";
respondido 22 nov., 15:10
Esta es una mala idea porque Android podría cerrar la actividad y perder efectivamente los datos. - Gerard
@Gerard pero, ¡esta clase no es actividad! - javad
Si todo lo que tiene son constantes, puede crear una interfaz en su lugar. - Aniket Thakur
De nuevo, un enfoque estático, que no es nada nuevo en comparación con Computadora Dice No y Przemek Marcinkiewicz's respuestas. - Múrmel
Evite siempre el uso de estática para campos no constantes. - Asamblea del Islam
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas android android-intent android-activity or haz tu propia pregunta.
Usé la preferencia compartida, también es útil para mantener los datos de inicio de sesión en la función de recordatorio de contraseña: shareef
Esto funciona para mí stackoverflow.com/a/7325248/2125322 Gracias Darshan Computing - matasoy
stackoverflow.com/a/37774966/6456129 puede ser útil - Yessy
para tales casos, intente crear la clase commomUtils con el método de preferencias compartidas ... esto mantendrá el código limpio y los datos relacionados en un lugar. Y podrá borrar fácilmente un conjunto específico de datos con un solo método para borrar ese archivo de preferencias específico, sin borrar ninguno de los datos predeterminados de la aplicación ... - Muahmmad Tayyib