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

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


person june    schedule 19.12.2013    source источник
comment
Пробовали ли вы использовать SharedPreferences в качестве хранилища сеансов? Не совсем уверен в вопросах безопасности/безопасности, но это может быть то, что вам нужно.   -  person mehmetseckin    schedule 19.12.2013


Ответы (9)


Создайте один курс для своего 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();

Проделайте то же самое с паролем

person Bhanu Sharma    schedule 19.12.2013
comment
какова цель prefsCommit(); - person Husnain Aslam; 29.03.2016
comment
Попробуйте вместо этого использовать apply(); commit() немедленно записывает свои данные в постоянное хранилище, тогда как apply() обрабатывает их в фоновом режиме. - person Husnain Aslam; 29.03.2016
comment
я получаю красную строку на prefsCommit(); - person z.al; 03.01.2017
comment
Нет необходимости снова использовать prefCommit. Пожалуйста, игнорируйте эту строку кода (LOC). - person Trinadh Koya; 25.05.2017
comment
Почему у меня эта ошибка?-> ошибка: не удается найти символьную переменную PreferenceManager, когда я реализую этот класс. - person Marcos Riveros; 29.06.2018
comment
Сохранение пароля в SharedPreferences кажется плохой идеей, почему бы не использовать уникальный идентификатор сеанса? - person ndw; 23.07.2019

Этого можно добиться с помощью 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;
    }
}
person nikvs    schedule 19.12.2013
comment
Это правильный способ обработки сессий. Благодарю вас! - person Jalal; 15.11.2017

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

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

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

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

person Sanket Shah    schedule 19.12.2013
comment
как вы думаете, это безопасно? - person Swap-IOS-Android; 10.09.2014
comment
Да, конечно, потому что общие настройки всегда хранятся в данных. поэтому никто не может импортировать данные с УСТРОЙСТВ. Тем не менее вас не устраивает, что вы можете хранить имя пользователя и пароль в зашифрованном виде. @Swap-IOS-Android - person Sanket Shah; 11.09.2014

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

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

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

person Phantômaxx    schedule 19.12.2013

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

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

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

person Shahina    schedule 19.12.2013

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

person Ayoub    schedule 19.12.2013

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

person Yogamurthy    schedule 19.12.2013
comment
сможет ли пользователь поддерживать сеанс даже после закрытия приложения без выхода из системы? - person june; 19.12.2013
comment
да. он сможет. вы собираетесь очистить общие настройки только в том случае, если он нажмет кнопку выхода из системы. до тех пор, пока общие префы не будут сохранены внутри вашего приложения. - person Yogamurthy; 19.12.2013

Исходный код

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

Получить предыдущий идентификатор входа в систему 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 
person Keshav Gera    schedule 19.09.2017

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

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;
    }
}
person Nain Abbas    schedule 31.08.2018