2012-10-05 19 views
23

En este momento estoy tratando de crear una aplicación de Android, supongo que va a ser un concepto de "X" bien. Así que estoy creando una pantalla de inicio de sesión. Lo que quiero hacer es, de inmediato, iniciar sesión en esa aplicación en mi dispositivo móvil, siempre que inicie sesión cada vez que intento acceder a esa aplicación.¿Cómo mantener las aplicaciones de Android siempre registradas en el estado?

Por ejemplo nuestras Facebook, g electrónico y yahoo, etc .. en nuestros teléfonos móviles

¿Qué hacer para eso?

Respuesta

53

Utilice la preferencia compartida para la funcionalidad de inicio de sesión automático. Cuando los usuarios inician sesión en su aplicación, almacene el estado de inicio de sesión en sharedPreference y borre sharedPreference cuando los usuarios cierren la sesión.

Compruebe siempre que el usuario entre en la aplicación si el estado del usuario de la Preferencia compartida es verdadero, entonces no es necesario volver a iniciar sesión, sino diríjase a la página de inicio de sesión.

Para lograr esto, primero cree una clase, en esta clase necesita escribir toda la función relacionada con el valor de obtención y configuración en la preferencia compartida. Por favor mira este Código a continuación.

public class SaveSharedPreference 
{ 
    static final String PREF_USER_NAME= "username"; 

    static SharedPreferences getSharedPreferences(Context ctx) { 
     return PreferenceManager.getDefaultSharedPreferences(ctx); 
    } 

    public static void setUserName(Context ctx, String userName) 
    { 
     Editor editor = getSharedPreferences(ctx).edit(); 
     editor.putString(PREF_USER_NAME, userName); 
     editor.commit(); 
    } 

    public static String getUserName(Context ctx) 
    { 
     return getSharedPreferences(ctx).getString(PREF_USER_NAME, ""); 
    } 
} 

Ahora en la actividad principal (la "actividad" en la que se redirigen a los usuarios cuando se haya identificado) compruebe primero

if(SaveSharedPreference.getUserName(MainActivity.this).length() == 0) 
{ 
    // call Login Activity 
} 
else 
{ 
    // Stay at the current activity. 
} 

En la actividad de sesión si la conexión del usuario con éxito a continuación, establecer nombre de usuario utilizando la función setUserName() .

+0

¿Me podría enviar al menos programa de una muestra de – Rohith

+0

Cuando hago esto y tratar de entrar de nuevo, devuelve nulo – Sauron

+1

esto es muy inseguro, porque puede acceder a las Preferencias Compartidas como archivo xml en teléfonos rooteados – Choletski

0

después del inicio de sesión cuando se presiona hacia atrás llamada moveTaskToBack(true);

de esta solicitud será en el estado de fondo. Espero ayuda

-1

Primero después de un inicio de sesión exitoso, guarde el nombre de usuario/correo electrónico y la contraseña en SharedPreferences.

Siempre que se inicie la aplicación, ejecute un código que recuperará el nombre de usuario y la contraseña de sharedPrefernces y luego estos dos valores se pueden pasar como un parámetro a un método que autenticará al usuario.

+0

solo necesita guardar la cookie o hash o algo que identifique la sesión ... guardar el usuario y la contraseña a la vista no será bueno para la seguridad ... – tyoc213

13

Usted puede agregar lo siguiente para la operación de cierre de sesión en su SaveSharedPreference.java:

public static void clearUserName(Context ctx) 
{ 
    Editor editor = getSharedPreferences(ctx).edit(); 
    editor.clear(); //clear all stored data 
    editor.commit(); 
} 
6

Siempre y cuando ... así que esto parece ser un enfoque de inicio de sesión automático. La aplicación se inicia, el usuario no tiene que volver a iniciar sesión una vez que ha proporcionado su información de autorización. Hay varias formas de lograr esto. La API de Facebook, p. proporciona un mecanismo para iniciar sesión sin el uso de un elemento de formulario. Así que básicamente tendría que construir una vista en la que el usuario pueda proporcionar su información de autorización una vez, almacenarla en SharedPreferences e iniciar sesión automáticamente la próxima vez. Incluso si no hay tal inicio de sesión basado en API y tiene que usar un formulario de inicio de sesión proporcionado, a veces podría simular la solicitud POST para iniciar sesión. Esto depende de la implementación del lado del servidor real de ese formulario. Pero recuerde: este es un problema de seguridad. Por lo tanto, nunca almacene las credenciales de autorización en formato de texto claro. No confíe en criptarlo mediante una clave definida en su aplicación ya que esta clave puede detectarse mediante la ingeniería inversa de su APK. En su lugar, use muchas informaciones colectivas sobre el dispositivo y una clave que el usuario debe ingresar o que la aplicación genera y almacena de forma aleatoria.

1

El uso de las Preferencias compartidas es una forma de guardar y recuperar datos de pares clave-valor en Android y también de mantener la sesión en toda la aplicación.

Para trabajar con SharedPreferences que debe tomar los siguientes pasos:

  1. inicialización de la interfaz compartir SharedPreferences haciendo pasar dos argumentos al constructor (String e Integer)

    // Sharedpref file name 
    private static final String PREF_NAME = "PreName"; 
    // Shared pref mode 
    int PRIVATE_MODE = 0; 
    

    // Inicializando SharedPreferences SharedPreferences pref = getApplicationContext(). GetSharedPreferences ("MyPref", 0); // 0 - para el modo privado

  2. Usando la interfaz Editor y sus métodos para modificar los valores SharedPreferences y para almacenar datos para su futura recuperación

    //Initialising the Editor 
        Editor editor = pref.edit(); 
        editor.putBoolean("key_name", true); // Storing boolean - true/false 
    

    editor.putString ("nombre_tecla", "cadena de valor") ; // Almacenando la cadena editor.putInt ("key_name", "int value"); // Almacenar entero editor.putFloat ("key_name", "float value"); // Almacenamiento de float editor.putLong ("key_name", "long value"); // Almacenamiento largo

    editor.commit(); // confirmar los cambios

  3. Recuperación de datos

Los datos pueden ser recuperados de las preferencias guardadas llamando al método getString() (Para cadena). Recuerde que este método debe invocarse en Preferencias compartidas y 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 
  1. Por último, la limpieza/eliminación de datos como en el caso de cierre de sesión

Si desea eliminar de preferencias compartidas que puede llamar eliminar (“nombre_tecla”) para eliminar ese valor particular. Si desea eliminar todos los datos, llame claro()

editor.remove("name"); // will delete key name 
editor.remove("email"); // will delete key email 

editor.commit(); // commit changes 

Following will clear all the data from shared preferences 
editor.clear(); 
editor.commit(); // commit changes 

Por favor, siga el siguiente enlace para descargar un simple y sencillo ejemplo: http://www.androidhive.info/2012/08/android-session-management-using-shared-preferences/

espero que no he ido en contra de las normas y regulaciones de la plataforma para compartir este enlace.

//This is my SharedPreferences Class 
    import java.util.HashMap; 
import android.annotation.SuppressLint; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 

public 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 
    @SuppressLint("CommitPrefEdits") 
    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, MainActivity.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<String, String> getUserDetails() { 
     HashMap<String, String> user = new HashMap<String, String>(); 
     // 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 
     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, MainActivity.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); 
    } 
} 


Finally, you will have to create an instance of this SessionManager class in the onCreate method of your activity class and then call the createLoginSession for the session that will be used throughout the entire session 



// Session Manager Class 
    SessionManager session; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Session Manager 
     session = new SessionManager(getApplicationContext()); 
session.createLoginSession("Username", intentValue); 
} 

Espero que ayude.

0

Xamarin.Android puerto de Chirag Raval 's y LINTUism' respuestas s:

public class SharedPreference 
{ 
    static ISharedPreferences get(Context ctx) 
    { 
     return PreferenceManager.GetDefaultSharedPreferences(ctx); 
    } 

    public static void SetUsername(Context ctx, string username) 
    { 
     var editor = get(ctx).Edit(); 
     editor.PutString("USERNAME", username); 
     editor.Commit(); 
    } 

    public static string GetUsername(Context ctx) 
    { 
     return get(ctx).GetString("USERNAME", ""); 
    } 

    public static void Clear(Context ctx) 
    { 
     var editor = get(ctx).Edit(); 
     editor.Clear(); 
     editor.Commit(); 
    } 
} 
Cuestiones relacionadas