Как сохранить сессию в Android?

Может кто-нибудь сказать мне, как сохранить сеанс для входа пользователя. Например, когда пользователь входит в приложение, ему необходимо выполнить вход, если только пользователь не вышел из системы или не удалил приложение, подобное gmail в Android.

12 ответов

Решение

Сделайте один класс для вашего SharedPreferences

public class Session {

    private SharedPreferences prefs;

    public Session(Context cntx) {
        // TODO Auto-generated constructor stub
        prefs = PreferenceManager.getDefaultSharedPreferences(cntx);
    }

    public void setusename(String usename) {
        prefs.edit().putString("usename", usename).commit();
    }

    public String getusename() {
        String usename = prefs.getString("usename","");
        return usename;
    }
}

Теперь, после создания этого класса, когда вы захотите его использовать, используйте вот так: создайте объект этого класса как

private Session session;//global variable 
session = new Session(cntx); //in oncreate 
//and now we set sharedpreference then use this like

session.setusename("USERNAME");

Теперь, когда вы хотите получить имя пользователя, то же самое должно быть сделано для объекта сеанса и вызвать это

session.getusename();

Сделать то же самое для пароля

Вы можете достичь этого с помощью AccountManager,

Пример кода

// method to add account..
private void addAccount(String username, String password) {
    AccountManager accnt_manager = AccountManager
            .get(getApplicationContext());

    Account[] accounts = accnt_manager
            .getAccountsByType(getString(R.string.account_type)); // account name identifier.

    if (accounts.length > 0) {
        return;
    }

    final Account account = new Account(username,
            getString(R.string.account_type));

    accnt_manager.addAccountExplicitly(account, password, null);

    final Intent intent = new Intent();
    intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, username);
    intent.putExtra(AccountManager.KEY_PASSWORD, password);
    intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE,
            getString(R.string.account_type));
    // intent.putExtra(AccountManager.KEY_AUTH_TOKEN_LABEL,
    // PARAM_AUTHTOKEN_TYPE);
    intent.putExtra(AccountManager.KEY_AUTHTOKEN, "token");
    this.setAccountAuthenticatorResult(intent.getExtras());
    this.setResult(RESULT_OK, intent);
    this.finish();
}

// method to retrieve account.
private boolean validateAccount() {
    AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {

        @Override
        public void run(AccountManagerFuture<Bundle> arg0) {
            Log.e("calback", "msg");

            try {
                Bundle b = arg0.getResult();
                if (b.getBoolean(AccountManager.KEY_ACCOUNT_MANAGER_RESPONSE)) {
                    //User account exists!!..
                }    
            } catch (OperationCanceledException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (AuthenticatorException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };

    AccountManager accnt_manager = AccountManager
            .get(getApplicationContext());

    Account[] accounts = accnt_manager
            .getAccountsByType(getString(R.string.account_type));

    if (accounts.length <= 0) {
        return false;
    } else {
        loginNameVal = accounts[0].name;
        loginPswdVal = accnt_manager.getPassword(accounts[0]);
        return true;
    }
}

У меня есть один простой способ, а не поддерживать сессию.

т.е. просто хранить один boolean переменная с вашим именем пользователя и паролем. по умолчанию установлено значение, равное false.

После первого успешного входа в систему установите значение true.

Затем просто проверьте его значение в Mainactivity, если оно истинно, перейдите к следующему действию, в противном случае перейдите к действию входа.

Вы можете использовать логическое значение в SharedPreferences.

Загрузите его перед входом в систему, чтобы проверить, требуется ли вход в систему.

Сохраните его после входа в систему.

Используйте SharedPreferences. Код для сохранения значения в общих настройках:

SharedPreferences sp=getSharedPreferences("key", Context.MODE_PRIVATE);
SharedPreferences.Editor ed=sp.edit();
ed.putInt("value", your_value);
ed.commit();

Код для получения значения из общих преференций:

SharedPreferences sp=getSharedPreferences("key", Context.MODE_PRIVATE);
int value = sp.getInt("value", default_value);

Вы можете проверить вход и выход из системы, используя это значение.

Использование этого класса поможет вам хранить все типы сессий

public class Session {

    private SharedPreferences prefs;

    public Session(Context cntx) {
        // TODO Auto-generated constructor stub
        prefs = PreferenceManager.getDefaultSharedPreferences(cntx);
    }

    public void set(String key,String value) {
        prefs.edit().putString(key, value).commit();
    }

    public String get(String key) {
        String value = prefs.getString(key,"");
        return value;
    }
}

Используйте следующий код.

SessionManager.java

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 = "Pref";

    // 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
    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<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, 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);
    }
}

А в MainActivity сделайте как следующее.

public class MainActivity 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("ABC", "abc@gmail.com");

                        // 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);
                }

            }
        });
    }        
}
public class Session {

    private SharedPreferences prefs;

    public Session(Context cntx) {
        // TODO Auto-generated constructor stub
        prefs = PreferenceManager.getDefaultSharedPreferences(cntx);
        editor = prefs.edit();
    }

    public void setusename(String usename) {
        editor.putString("usename", usename).commit();

    }

    public String getusename() {
        String usename = prefs.getString("usename","");
        return usename;
    }
}

Благодаря этому формату вы можете установить или получить несколько объектов данных, вам не нужно создавать отдельные функции для хранения разных моделей в SharedPreferences.

* Здесь, в этом формате, вам не нужно передавать свой объект KEY для putString() и getString()
* Используя имя класса объекта, вы можете однозначно идентифицировать свой объект сеанса как для setModel(), так и для getModel().
      public class Session {

private final SharedPreferences pref;

public Session(Context ctx) {
    pref = PreferenceManager.getDefaultSharedPreferences(ctx);
    //pref = ctx.getSharedPreferences("IDENTIFIED_NAME", Context.MODE_PRIVATE);
}

public <U> void setModel(U obj) {
    pref.edit().putString(getClassName(obj), SerializeObject(obj)).apply();
}

/* Parameter Example: Class.class */
public <U> U getModel(Class<U> type) {
    String user = pref.getString(type.getSimpleName(), null);
    if (isEmptyOrNull(user)) {
        return null;
    }
    return DeserializeObject(user, type);
}





/* The below functions are for support, You can move the below part to your own BaseUtil class. */
public static boolean isEmptyOrNull(String data) {
    if (data == null) {
        return true;
    }

    if (data.isEmpty() || data.trim().isEmpty()) {
        return true;
    }

    return false;
}

public static String getClassName(Object obj) {
    return obj.getClass().getSimpleName();
}

public static String SerializeObject(Object myObject) {
    // serialize the object
    try {
        Gson gson = new Gson();
        String json = gson.toJson(myObject);
        return json;
    } catch (Exception e) {
        System.out.println(e);
        return null;
    }
}

public static <U> U DeserializeObject(String serializedObject, Class<U> type) {
    // serialize the object
    try {
        if (serializedObject == null || serializedObject.isEmpty()) {
            return null;
        }
        GsonBuilder gsonBuilder = new GsonBuilder();
        Gson gson = gsonBuilder.create();
        U data = gson.fromJson(serializedObject, type);
        return data;
    } catch (Exception e) {
        System.out.println(e);
        return null;
    }
}
}

Создайте класс объекта (имя_файла: UserModel.java)

      public class UserModel {
    public String userId;
    public String firstName;
    public String lastName;
    public String email;
    public String phone;
}

Как использовать - Для setModel() и getModel()

      //creating an instance of the Session class
Session session = new Session(ctx); // Here you have to pass the Context(ctx)

// setting value in the UserModel
UserModel obj = new UserModel();
obj.firstName = "Apu";
obj.lastName = "Pradhan";
obj.email = "godfindapu@gmail.com";
obj.phone = "123456789";

// set UserModel in the Session
session.setModel(obj);

//getting UserModel data from the Session
UserModel userData = session.getModel(UserModel.class);

Исходный код

https://drive.google.com/open?id=0BzBKpZ4nzNzUcUZxeHo0UnJ5UHc

Получить предыдущий Логин ID в Android

**After Login save Email ID is SharedPreferences** 

    emaidId = et_Email.getText().toString().trim();

    SharedPreferences ss = getSharedPreferences("loginSession_key", 0);
    Set<String> hs = ss.getStringSet("set", new HashSet<String>());
    hs.add(emaidId);
    SharedPreferences.Editor edit = ss.edit();
    edit.clear();
    edit.putStringSet("set", hs);
    edit.commit();

===================onCreate()====================
===================AutoCompleteTextView set Adapter===================

**Fetch PRevious Login Email id in email EditText**

SharedPreferences sss = getSharedPreferences("loginSession_key", 0);            // todo loginSession_key   key name ALWAYS SAME
Log.i("chauster", "2.set = " + sss.getStringSet("set", new HashSet<String>()));
Log.e("Session", "Value->" + sss.getStringSet("set", new HashSet<String()));
ArrayList<String> al = new ArrayList<>();
al.addAll(sss.getStringSet("set", new HashSet<String>()));
//Creating the instance of ArrayAdapter containing list of language names
ArrayAdapter<String> adapter = new ArrayAdapter<String>
                (this, android.R.layout.select_dialog_item, al);
//Getting the instance of AutoCompleteTextView
et_Email.setThreshold(1);//will start working from first character
et_Email.setAdapter(adapter);//setting the adapter data into the 

Вы можете получить это поведение несколькими различными способами, один из которых я предпочитаю - установить флаг в общих префиксах. Если пользователь входит в систему и проверяет его при запуске приложения, если вы получаете значение по умолчанию, то пользователь не является loggend, иначе вы должны установить свой флаг (я использую имя пользователя) и избегать раздела входа в систему.

Сохранить пользовательские данные в общих настройках, пока пользователь не выйдет из системы. как только пользователь выйдет из системы, удалите данные из общих настроек.

Другие вопросы по тегам