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 uno activity
.
Al hacer clic sign-out
, pasaré el session id
usuario registrado para cerrar sesión. ¿Alguien puede guiarme sobre cómo mantenerme session id
disponible para todos activities
?
Cualquier alternativa a este caso
Respuestas:
La forma más fácil de hacer esto sería pasar la identificación de la sesión a la actividad de cierre de sesión en la
Intent
que está utilizando para iniciar la actividad:Acceda a esa intención en la próxima actividad:
Los documentos para Intents tienen más información (mira la sección titulada "Extras").
fuente
Long session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
setData
y cuál es la diferencia entre estos dos enfoques? ¿Cuál es mejor?En su Actividad actual, cree una nueva
Intent
:Luego, en la nueva Actividad, recupere esos valores:
Use esta técnica para pasar variables de una Actividad a la otra.
fuente
extras.getInt("new_variable_name")
. Si intenta obtenerlo a través degetString()
Android, vea que se le dio un int y devuelve nulo.startActivity(i);
? Quiero decir, ¿puedo hacer que la actividad A llame a la actividad B , y eso devuelve datos a la actividad A ? estoy confundido?Pasar intenciones extras es un buen enfoque, como señaló Erich.
Sin embargo, el objeto Aplicación es otra forma, y a veces es más fácil cuando se trata con el 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 configurar / obtener lo que desee allí y acceder a él desde cualquier actividad (en la misma aplicación) con getApplication () .
También tenga en cuenta que otros enfoques que puede ver, como las estadísticas, pueden ser problemáticos porque pueden provocar pérdidas de memoria . La aplicación también ayuda a resolver esto.
fuente
Clase de origen:
Clase de destino (clase NewActivity):
fuente
Solo tiene que enviar extras mientras llama a su intención.
Me gusta esto:
Ahora en el
OnCreate
método de tuSecondActivity
puedes buscar los extras como este.Si el valor que envió estaba en
long
:Si el valor que envió fue un
String
:Si el valor que envió fue un
Boolean
:fuente
boolean
ylong
captadores que vale la pena comentar en mi opinión, no una respuesta.Me ayuda a ver las cosas en contexto. Aquí hay dos ejemplos.
Transmitir datos hacia adelante
Actividad principal
startActivity
.MainActivity.java
Segunda actividad
getIntent()
paraIntent
iniciar la segunda actividad. Luego puede extraer los datosgetExtras()
y la clave que definió en la primera actividad. Como nuestros datos son una cadena, solo la usaremosgetStringExtra
aquí.SecondActivity.java
Pasar datos de vuelta
Actividad principal
startActivityForResult
, proporcionándole un código de resultado arbitrario.onActivityResult
. Esto se llama cuando finaliza la segunda actividad. Puede asegurarse de que realmente sea la segunda actividad al verificar el código de resultado. (Esto es útil cuando está iniciando múltiples actividades diferentes desde la misma actividad principal).Intent
. Los datos se extraen utilizando un par clave-valor. Podría usar cualquier cadena para la clave, pero usaré la predefinidaIntent.EXTRA_TEXT
ya que estoy enviando texto.MainActivity.java
Segunda actividad
Intent
. Los datos se almacenanIntent
utilizando un par clave-valor. Elegí usarIntent.EXTRA_TEXT
para mi clave.RESULT_OK
y agregue la intención que contiene sus datos.finish()
para cerrar la segunda actividad.SecondActivity.java
fuente
Nota actualizada que mencioné 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. Es mejor usar intenciones. Tiene una extensa lista de métodos sobrecargados que se pueden usar para transferir mejor muchos tipos de datos diferentes entre actividades. Echa un vistazo a intent.putExtra . Este enlace 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 incluya los parámetros requeridos para lanzar la intención. Que luego proporciona fácilmente la configuración y recuperación de parámetros. Entonces puede verse así
Luego puede crear una intención para la actividad prevista y asegurarse de tener todos los parámetros. Se puede adaptar para fragmentos a. Un ejemplo simple de arriba, pero entiendes la idea.
fuente
Intenta hacer lo siguiente:
Cree una clase simple de "ayuda" (fábrica para sus intenciones), como esta:
Esta será la fábrica para todas sus intenciones. Cada vez que necesite una nueva intención, cree un método de fábrica estático en IntentHelper. Para crear una nueva intención, solo debes decirlo así:
En tu actividad. Cuando desee "guardar" algunos datos en una "sesión", utilice lo siguiente:
Y envía esta intención. En la Actividad objetivo, su campo estará disponible como:
Entonces, ahora podemos usar Intent como la misma sesión anterior (como en servlets o JSP ).
fuente
También puede pasar objetos de clase personalizados haciendo una clase parcelable . 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 construir y obtendrá un nuevo código. Copie todo esto y reemplace el contenido original de la clase. Entonces-
y obtener el resultado en NextActivity como-
Ahora puede simplemente usar el objeto foo como lo hubiera hecho.
fuente
Otra forma es usar un campo público estático en el que almacene datos, es decir:
fuente
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,
También deberías importar
Luego, en la siguiente Acitvity (SecondActivity), debe recuperar los datos de la intención utilizando el siguiente código.
fuente
Puedes usar
SharedPreferences
...Inicio sesión. Id. De sesión de almacén de tiempo en
SharedPreferences
Desconectar. ID de sesión de búsqueda de tiempo en preferencias compartidas
Si no tiene el ID de sesión requerido, elimine las preferencias compartidas:
Eso es muy útil, porque una vez guarda el valor y luego recupera cualquier lugar de actividad.
fuente
El enfoque estándar.
Ahora, en su segunda actividad, recupere sus datos del paquete:
Obtén el paquete
Extraer los datos ...
fuente
i.putExtras()
/getIntent().getString()
propuesto por otras 6 respuestas ...De la actividad
A la actividad
fuente
Bundle
enfoque basado ya fue propuesto por PRABEESH RK en 2012 y Ajay Venugopal , Krishna . Y podría reducirse ali.putExtras()
/getIntent().getString()
que es propuesto por otras 8 respuestas ...Puede enviar datos entre actividades utilizando el objeto de intención. Considere que tiene dos actividades, a saber,
FirstActivity
ySecondActivity
.Inside FirstActividad:
Intención de uso:
Inside SecondActivity
Ahora puede usar diferentes métodos de clase de paquete para obtener los valores pasados de FirstActivity por Key.
Por ejemplo
bundle.getString("key")
,bundle.getDouble("key")
,bundle.getInt("key")
etc.fuente
Bundle
enfoque basado ya fue propuesto por PRABEESH RK en 2012 y Ajay Venugopal . Y podría reducirse ali.putExtras()
/getIntent().getString()
que es propuesto por otras 7 respuestas ...Si desea transferir un mapa de bits entre Actividades / Fragmentos
Actividad
Para pasar un mapa de bits entre actividades
Y en la clase de actividad
Fragmento
Para pasar un mapa de bits entre fragmentos
Para recibir dentro del SecondFragment
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 , como esta
En la primera actividad
Y en la segunda actividad
fuente
Puedes recuperarlo en otra actividad. Dos caminos:
La segunda forma es:
fuente
Aquí está mi mejor práctica y ayuda mucho cuando el proyecto es enorme y complejo.
Supongamos que tengo 2 actividades,
LoginActivity
yHomeActivity
. Quiero pasar 2 parámetros (nombre de usuario y contraseña) deLoginActivity
aHomeActivity
.Primero, creo mi
HomeIntent
Así es como paso los datos en mi LoginActivity
Paso final, así es como recibo los datos en
HomeActivity
¡Hecho! Genial :) Solo quiero compartir mi experiencia. Si trabaja en un proyecto pequeño, este no debería ser el gran problema. Pero cuando trabajas en un gran proyecto, es realmente doloroso cuando quieres refactorizar o corregir errores.
fuente
Respuesta suplementaria: convenciones de nomenclatura para la cadena clave
El proceso real de pasar datos ya ha sido respondido, sin embargo, la mayoría de las respuestas utilizan cadenas codificadas para el nombre de la clave en la intención. Esto generalmente está bien cuando se usa solo dentro de su aplicación. Sin embargo, la documentación recomienda utilizar las
EXTRA_*
constantes para los tipos de datos estandarizados.Ejemplo 1: uso de
Intent.EXTRA_*
teclasPrimera actividad
Segunda actividad:
Ejemplo 2: definir tu propia
static final
claveSi una de las
Intent.EXTRA_*
cadenas no se ajusta a sus necesidades, puede definir la suya al comienzo de la primera actividad.Incluir el nombre del paquete es solo una convención si solo usa la clave en su propia aplicación. Pero es necesario evitar conflictos de nombres si está creando algún tipo de servicio al que otras aplicaciones puedan llamar con una intención.
Primera actividad:
Segunda actividad:
Ejemplo 3: uso de una clave de recurso de cadena
Aunque no se menciona en la documentación, esta respuesta recomienda utilizar un recurso String para evitar dependencias entre actividades.
strings.xml
Primera actividad
Segunda actividad
fuente
Puedes usar
Intent
Otra forma podría ser usar el patrón singleton también:
Desde tu primera actividad
En SecondActivity
fuente
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 de la
Bundle
clase. A continuación, llame la actividad usando ya seastartActivity()
ostartActivityForResult()
métodos.Puede encontrar más información al respecto, con un ejemplo de la publicación del blog Pasando datos a una Actividad .
fuente
Intent#putExtra()
). Pero agrega otroBundle
y hace las cosas más complicadas.Puede probar Preferencia compartida, puede ser una buena alternativa para compartir datos entre las actividades.
Para guardar la identificación de la sesión:
Para conseguirlos -
fuente
Inicie otra actividad desde esta actividad pasando parámetros a través de Bundle Object
Recuperar en otra actividad (YourActivity)
Esto está bien para un tipo de datos simple y amable. Pero si desea pasar datos complejos entre actividades, primero debe serializarlos.
Aquí tenemos el modelo de empleado
Puede usar Gson lib proporcionado por google para serializar datos complejos como este
fuente
Kotlin
Pase de la primera actividad
Entra en la segunda actividad
Sugerencia
Siempre coloque las claves en un archivo constante para una forma más administrada.
fuente
fuente
Charlie Collins me dio una respuesta perfecta usando el
Application.class
. No sabía que podíamos subclasificarlo tan fácilmente. Aquí hay un ejemplo simplificado usando una clase de aplicación personalizada.AndroidManifest.xml
Otorgue el
android:name
atributo para usar su propia clase de aplicación.MyApplication.java
Use esto como un titular de referencia global. Funciona bien dentro de un mismo proceso.
MainActivity.java
Establezca la referencia global "singleton" a la instancia de la aplicación.
MyPreferences.java
Un ejemplo simple donde uso una actividad principal de otra instancia de actividad.
fuente
Recientemente lancé Vapor API , un marco de Android con 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 un.put(...)
método muy sobrecargado para que no tenga que preocuparse explícitamente sobre el tipo de datos que está confirmando, siempre que sea compatible. También es fluido, por lo que puede encadenar llamadas:Opcionalmente, también 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, podría usar un
Intent
. En Vapor API también puede usar el.put(...)
método encadenado sobrecargado enVaporIntent
:Y páselo como un extra, como se menciona en las otras respuestas. Puede recuperar extras de su
Activity
, y además, si está usando,VaporActivity
esto se hace automáticamente para que pueda usar:Para recuperarlos en el otro extremo en el
Activity
que cambie.Espero que sea de interés para algunos :)
fuente
Primera actividad:
Segunda actividad:
fuente
Puede pasar datos entre actividades en la aplicación de 3 maneras
pasar datos en la intención tiene algún límite. Para una gran cantidad de datos, puede usar el uso compartido de datos a nivel de aplicación y al almacenarlos en SharedPreference aumenta el tamaño de su aplicación
fuente
Use una clase global:
Puede llamar a los establecedores y captadores de esta clase desde todas las demás clases. Haga eso, necesita hacer un GlobalClass-Object en cada Actitity:
Entonces puedes llamar por ejemplo:
fuente