Las sesiones son útiles cuando desea almacenar datos de usuario globalmente a través de la aplicación. Esto se puede hacer de dos maneras. Uno es almacenarlos en variables globales y el segundo es almacenar los datos en preferencias compartidas. El problema con el almacenamiento de datos en la variable global es que los datos se perderán una vez que el usuario cierre la aplicación, pero el almacenamiento de los datos en las preferencias compartidas será persistente aunque el usuario cierre la aplicación.
Las preferencias compartidas de la aplicación le permiten guardar y recuperar datos clave, pares de valores. Antes de entrar en el tutorial, estoy dando información básica necesaria para trabajar con preferencias compartidas.
Inicialización
- Recibo numerosos errores inútiles en Eclipse cuando creo un nuevo proyecto de Android. ¡Eclipse muestra errores en el archivo creado por sí mismo! ¿Qué tengo que hacer?
- ¿Cuál es la mejor aplicación de Android para un proyecto de último año para completar fácilmente en 7 meses?
- ¿Por qué la interfaz de usuario de Android es tan confusa? ¿Por qué todas las empresas se centran en las características en lugar de la experiencia, y por qué Google no está haciendo algo al respecto?
- ¿Cuáles son las mejores herramientas de desarrollo de Android?
- ¿Existe algún marco MVC estándar en el desarrollo de aplicaciones de Android? Si no, ¿vale la pena desarrollar uno?
Las preferencias compartidas de la aplicación se pueden obtener utilizando el método getSharedPreferences (). También necesita un editor para editar y guardar los cambios en las preferencias compartidas. El siguiente código se puede usar para obtener las preferencias compartidas de la aplicación.
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
Editor editor = pref.edit();
Almacenamiento de datos
Puede guardar datos en preferencias compartidas usando el editor. Todos los tipos de datos primitivos como booleanos, flotantes, ints, largos y cadenas son compatibles. Llame a editor.commit () para guardar los cambios en las preferencias compartidas.
editor.putBoolean("key_name", true); // Storing boolean - true/false
editor.putString("key_name", "string value"); // Storing string
editor.putInt("key_name", "int value"); // Storing integer
editor.putFloat("key_name", "float value"); // Storing float
editor.putLong("key_name", "long value"); // Storing long
editor.commit(); // commit changes
Recuperando datos
Los datos se pueden recuperar de las preferencias guardadas llamando al método getString () (para cadenas). Recuerde que este método debe llamarse en Preferencias compartidas, no en Editor.
// returns stored preference value
// If value is not present return second param value - In this case null
pref.getString("key_name", null); // getting String
pref.getInt("key_name", null); // getting Integer
pref.getFloat("key_name", null); // getting Float
pref.getLong("key_name", null); // getting Long
pref.getBoolean("key_name", null); // getting boolean
Borrar / borrar datos
Si desea eliminar de las preferencias compartidas, puede llamar a remove (“key_name”) para eliminar ese valor en particular. Si desea eliminar todos los datos, llame a clear ()
editor.remove("name"); // will delete key name
editor.remove("email"); // will delete key email
editor.commit(); // commit changes
Lo siguiente borrará todos los datos de las preferencias compartidas
editor.clear();
editor.commit(); // commit changes
El siguiente es un tutorial simple que tendrá un formulario de inicio de sesión y una pantalla de tablero. Al principio, el usuario iniciará sesión con los detalles de inicio de sesión y una vez que haya iniciado sesión correctamente, sus credenciales (nombre, correo electrónico) se almacenarán en las preferencias compartidas.
—————————————————————————————————————————————————— –
Gestión de sesiones de usuario utilizando preferencias compartidas
1) Cree un nuevo proyecto en Eclipse IDE File ⇒ Nuevo ⇒ Proyecto de aplicación de Android y complete todos los detalles requeridos
2) Estoy agregando la clase de administrador de diálogo de alerta para mostrar mensajes de alerta mientras se valida el formulario de inicio de sesión. Cree una nueva clase y asígnele el nombre AlertDialogManager.java y pegue el siguiente código.
AlertDialogManager.java
package
com.androidhive.sessions;
import
android.app.AlertDialog;
import
android.content.Context;
import
android.content.DialogInterface;
AlertDialogManager {
class
AlertDialogManager {
/**
* Function to display simple Alert Dialog
* @param context - application context
* @param title - alert dialog title
* @param message - alert message
* @param status - success/failure (used to set icon)
* - pass null if you don't want icon
* */
public
void
showAlertDialog(Context context, String title, String message,
Boolean status) {
AlertDialog alertDialog = new
AlertDialog.Builder(context).create();
// Setting Dialog Title
alertDialog.setTitle(title);
// Setting Dialog Message
alertDialog.setMessage(message);
if(status != null)
// Setting alert dialog icon
alertDialog.setIcon((status) ? R.drawable.success : R.drawable.fail);
// Setting OK Button
alertDialog.setButton("OK", new
DialogInterface.OnClickListener() {
public
void
onClick(DialogInterface dialog, int
which) {
}
});
// Showing Alert Message
alertDialog.show();
}
}
3) Estoy escribiendo todas las funciones relacionadas con la sesión en una clase para que estén disponibles en todas las actividades. Cree una nueva clase llamada SessionManagement.java y agregue las siguientes líneas de código
SessionManagement.java
package
com.androidhive.sessions;
import
java.util.HashMap;
import
android.content.Context;
import
android.content.Intent;
import
android.content.SharedPreferences;
import
android.content.SharedPreferences.Editor;
SessionManager {
class
SessionManager {
// Shared Preferences
SharedPreferences pref;
// Editor for Shared preferences
Editor editor;
// Context
Context _context;
// Shared pref mode
int
PRIVATE_MODE = 0;
// Sharedpref file name
private
static
final
String PREF_NAME = "AndroidHivePref";
// All Shared Preferences Keys
private
static
final
String IS_LOGIN = "IsLoggedIn";
// User name (make variable public to access from outside)
public
static
final
String KEY_NAME = "name";
// Email address (make variable public to access from outside)
public
static
final
String KEY_EMAIL = "email";
// Constructor
SessionManager(Context context){
public
SessionManager(Context context){
this._context = context;
pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = pref.edit();
}
4) En este ejemplo, estoy almacenando el estado de inicio de sesión , el nombre , el correo electrónico en las preferencias compartidas, por lo que agregué una función llamada createLoginSession (String name, String email) a la clase SessionManagement. Agregue la siguiente función a SessionManagement.java .
> Esta función simplemente almacena el estado de inicio de sesión (verdadero), el nombre, el correo electrónico en las preferencias compartidas.
/**
* Create login session
* */
public
void
createLoginSession(String name, String email){
// Storing login value as TRUE
editor.putBoolean(IS_LOGIN, true);
// Storing name in pref
editor.putString(KEY_NAME, name);
// Storing email in pref
editor.putString(KEY_EMAIL, email);
// commit changes
editor.commit();
}
5. Para obtener los datos de preferencias almacenados, agregué una función llamada getUserDetails () con el siguiente código.
> La siguiente función leerá las preferencias compartidas y devolverá los datos del usuario en HashMap
/**
* Get stored session data
* */
public
HashMap getUserDetails(){
HashMap user = new
HashMap();
// user name
user.put(KEY_NAME, pref.getString(KEY_NAME, null));
// user email id
user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null));
// return user
user;
return
user;
}
6) Para verificar si el usuario inició sesión o no, agregué una función checkLogin () a la que puede llamar en todas las Actividades para verificar el estado de inicio de sesión del usuario.
> Esta función simplemente verifica el estado de inicio de sesión del usuario desde las preferencias compartidas y, si el usuario no está conectado, lo redirigirá a LoginActivity
/**
* Check login method wil check user login status
* If false it will redirect user to login page
* Else won't do anything
* */
public
void
checkLogin(){
// Check login status
if(!this.isLoggedIn()){
// user is not logged in redirect him to Login Activity
Intent i = new
Intent(_context, LoginActivity.class);
// Closing all the Activities
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// Add new Flag to start new Activity
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Staring Login Activity
_context.startActivity(i);
}
}
7) Agregue una función llamada logoutUser () para borrar todos los datos de las preferencias compartidas. Llame a esta función cuando desee cerrar la sesión del usuario.
> Esta función borra todos los datos de sesión y redirige al usuario a LoginActivity
/**
* Clear session details
* */
public
void
logoutUser(){
// Clearing all data from Shared Preferences
editor.clear();
editor.commit();
// After logout redirect user to Loing Activity
Intent i = new
Intent(_context, LoginActivity.class);
// Closing all the Activities
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// Add new Flag to start new Activity
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Staring Login Activity
_context.startActivity(i);
}
Código final
SessionManagement.java
package
com.androidhive.sessions;
import
java.util.HashMap;
import
android.content.Context;
import
android.content.Intent;
import
android.content.SharedPreferences;
import
android.content.SharedPreferences.Editor;
SessionManager {
class
SessionManager {
// Shared Preferences
SharedPreferences pref;
// Editor for Shared preferences
Editor editor;
// Context
Context _context;
// Shared pref mode
int
PRIVATE_MODE = 0;
// Sharedpref file name
private
static
final
String PREF_NAME = "AndroidHivePref";
// All Shared Preferences Keys
private
static
final
String IS_LOGIN = "IsLoggedIn";
// User name (make variable public to access from outside)
public
static
final
String KEY_NAME = "name";
// Email address (make variable public to access from outside)
public
static
final
String KEY_EMAIL = "email";
// Constructor
SessionManager(Context context){
public
SessionManager(Context context){
this._context = context;
pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = pref.edit();
}
/**
* Create login session
* */
public
void
createLoginSession(String name, String email){
// Storing login value as TRUE
editor.putBoolean(IS_LOGIN, true);
// Storing name in pref
editor.putString(KEY_NAME, name);
// Storing email in pref
editor.putString(KEY_EMAIL, email);
// commit changes
editor.commit();
}
/**
* Check login method wil check user login status
* If false it will redirect user to login page
* Else won't do anything
* */
public
void
checkLogin(){
// Check login status
if(!this.isLoggedIn()){
// user is not logged in redirect him to Login Activity
Intent i = new
Intent(_context, LoginActivity.class);
// Closing all the Activities
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// Add new Flag to start new Activity
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Staring Login Activity
_context.startActivity(i);
}
}
/**
* Get stored session data
* */
public
HashMap getUserDetails(){
HashMap user = new
HashMap();
// user name
user.put(KEY_NAME, pref.getString(KEY_NAME, null));
// user email id
user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null));
// return user
user;
return
user;
}
/**
* Clear session details
* */
public
void
logoutUser(){
// Clearing all data from Shared Preferences
editor.clear();
editor.commit();
// After logout redirect user to Loing Activity
Intent i = new
Intent(_context, LoginActivity.class);
// Closing all the Activities
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// Add new Flag to start new Activity
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Staring Login Activity
_context.startActivity(i);
}
/**
* Quick check for login
* **/
// Get Login State
public
boolean
isLoggedIn(){
return
pref.getBoolean(IS_LOGIN, false);
}
}
8) Hasta ahora hemos terminado de crear la clase de gestión de sesión y ahora vamos a aprender cómo usar esta clase en su aplicación. Para esto, cree un formulario de inicio de sesión simple que solicite nombre de usuario, contraseña.
Cree un archivo xml de diseño y una clase para crear un formulario de inicio de sesión. Nombre el archivo xml como activity_login.xml y el nombre de la clase como LoginActivity.java
activity_login.xml
<LinearLayout
xmlns:android="
http://schemas.android.com/apk/r… "
xmlns:tools="
http://schemas.android.com/tools "
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dip">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Username (Enter 'test')"
android:singleLine="true"
android:layout_marginBottom="5dip"/>
<EditText
android:id="@+id/txtUsername"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dip"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Password (Enter 'test')"
android:layout_marginBottom="5dip"/>
<EditText
android:id="@+id/txtPassword"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dip"
android:password="true"
android:singleLine="true"/>
<Button
android:id="@+id/btnLogin"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Login"/>
Para fines de prueba, estoy verificando nombre de usuario , contraseña como prueba , prueba .
Una vez que el usuario ingrese los detalles de inicio de sesión correctos, se creará una sesión llamando a session.createLoginSession (“Android Hive”, “ [correo electrónico protegido] “) y el usuario será redirigido a MainActivity .
LoginActivity.java
package
com.androidhive.sessions;
import
android.app.Activity;
import
android.content.Intent;
import
android.os.Bundle;
import
android.view.View;
import
android.widget.Button;
import
android.widget.EditText;
import
android.widget.Toast;
class
public
LoginActivity extends
Activity {
// Email, password edittext
EditText txtUsername, txtPassword;
// login button
Button btnLogin;
// Alert Dialog Manager
AlertDialogManager alert = new
AlertDialogManager();
// Session Manager Class
SessionManager session;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
// Session Manager
session = new
SessionManager(getApplicationContext());
// Email, Password input text
txtUsername = (EditText) findViewById(R.id.txtUsername);
txtPassword = (EditText) findViewById(R.id.txtPassword);
Toast.makeText(getApplicationContext(), "User Login Status: "
+ session.isLoggedIn(), Toast.LENGTH_LONG).show();
// Login button
btnLogin = (Button) findViewById(R.id.btnLogin);
// Login button click event
btnLogin.setOnClickListener(new
View.OnClickListener() {
@Override
public
void
onClick(View arg0) {
// Get username, password from EditText
String username = txtUsername.getText().toString();
String password = txtPassword.getText().toString();
// Check if username, password is filled
if(username.trim().length() > 0
&& password.trim().length() > 0){
// For testing puspose username, password is checked with sample data
// username = test
// password = test
if(username.equals("test") && password.equals("test")){
// Creating user login session
// For testing i am stroing name, email as follow
// Use user real data
session.createLoginSession("Android Hive", " [email protected] ");
// Staring MainActivity
Intent i = new
Intent(getApplicationContext(), MainActivity.class);
startActivity(i);
finish();
}else{
// username / password doesn't match
alert.showAlertDialog(LoginActivity.this, "Login failed..", "Username/Password is incorrect", false);
}
}else{
// user didn't entered username or password
// Show alert asking him to enter the details
alert.showAlertDialog(LoginActivity.this, "Login failed..", "Please enter username and password", false);
}
}
});
}
}
9) Después de que el usuario sea redirigido a MainActivity, obtengo datos de sesión almacenados llamando a getUserDetails () y visualizándolos en vistas de texto.
> session.checkLogin () se llama para verificar el estado de inicio de sesión del usuario. Aquí, si el usuario no está conectado, será redirigido a LoginActivity.java
> Si el usuario ha iniciado sesión, los detalles del usuario se obtienen llamando a session.getUserDetails () y se muestran en vistas de texto.
> También tengo el botón de cerrar sesión que invoca una función session.logoutUser () para borrar los datos de la sesión.
Código de diseño para activity_main.xml
activity_main.xml
<LinearLayout
xmlns:android="
http://schemas.android.com/apk/r… "
xmlns:tools="
http://schemas.android.com/tools "
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dip">
<TextView
android:id="@+id/lblName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:layout_marginTop="40dip"
android:layout_marginBottom="10dip"/>
<TextView
android:id="@+id/lblEmail"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:layout_marginBottom="40dip"/>
<Button
android:id="@+id/btnLogout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Logout"/>
Código para MainActivity.java
package
com.androidhive.sessions;
import
java.util.HashMap;
import
android.app.Activity;
import
android.os.Bundle;
import
android.text.Html;
import
android.view.View;
import
android.widget.Button;
import
android.widget.TextView;
import
android.widget.Toast;
class
public
MainActivity extends
Activity {
// Alert Dialog Manager
AlertDialogManager alert = new
AlertDialogManager();
// Session Manager Class
SessionManager session;
// Button Logout
Button btnLogout;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Session class instance
session = new
SessionManager(getApplicationContext());
TextView lblName = (TextView) findViewById(R.id.lblName);
TextView lblEmail = (TextView) findViewById(R.id.lblEmail);
// Button logout
btnLogout = (Button) findViewById(R.id.btnLogout);
Toast.makeText(getApplicationContext(), "User Login Status: "
+ session.isLoggedIn(), Toast.LENGTH_LONG).show();
/**
* Call this function whenever you want to check user login
* This will redirect user to LoginActivity is he is not
* logged in
* */
session.checkLogin();
// get user data from session
HashMap user = session.getUserDetails();
// name
String name = user.get(SessionManager.KEY_NAME);
// email
String email = user.get(SessionManager.KEY_EMAIL);
// displaying user data
lblName.setText(Html.fromHtml("Name: "
+ name + "
"));
lblEmail.setText(Html.fromHtml("Email: "
+ email + "
"));
/**
* Logout button click event
* */
btnLogout.setOnClickListener(new
View.OnClickListener() {
@Override
public
void
onClick(View arg0) {
// Clear the session data
// This will clear all session data and
// redirect user to LoginActivity
session.logoutUser();
}
});
}
}
<manifest
xmlns:android="
http://schemas.android.com/apk/r… "
package="com.androidhive.sessions"
android:versionCode="1"
android:versionName="1.0"
>
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15"
/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
>
<activity
android:name=".MainActivity"
android:label="Dashboard Screen"
>
<action
android:name="android.intent.action.MAIN"
/>
<category
android:name="android.intent.category.LAUNCHER"
/>
<activity
android:name=".LoginActivity"
android:label="User Login"
>
Revisé este tutorial el año pasado cuando estaba haciendo mi curso de programación de Android en nuestra universidad. Tuvimos que desarrollar aplicaciones pesadas de gama alta. Este tutorial es muy útil.