Cómo mantener dos sesiones diferentes usando preferencias compartidas para dos usuarios en la misma aplicación de Android

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

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.

Puede usar la aplicación Parllel Space para disfrutar de aplicaciones duales en un solo teléfono Android.

O

Puedes cambiar de usuario.