【问题标题】:How to maintain session in android?如何在android中维护会话?
【发布时间】:2013-12-19 10:08:07
【问题描述】:

谁能告诉我如何为用户登录维护会话。例如,当用户登录应用程序时,除非用户注销或卸载类似于 android 中的 gmail 的应用程序,否则他们必须登录。

【问题讨论】:

  • 您是否尝试过使用SharedPreferences 作为会话存储工具?不太确定安全/安保问题,但可能是您需要的。

标签: android android-account android-authenticator


【解决方案1】:

为您的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;
    }
}

现在当你想使用这个类之后,像这样使用:make object of this class like

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

密码也一样

【讨论】:

  • prefsCommit() 的目的是什么;
  • 考虑使用 apply() 代替; commit() 立即将其数据写入持久存储,而 apply() 将在后台处理它。
  • 我在 prefsCommit() 上得到了红线;
  • 无需再次prefCommit。请忽略该行代码(LOC)。
  • 在 SharedPreferences 中存储密码似乎是个坏主意,为什么不使用唯一的 sessionID?
【解决方案2】:

您可以使用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;
    }
}

【讨论】:

  • 这是处理会话的正确方法。谢谢!
【解决方案3】:

我有一种简单的方法,而不是保持会话。

即只需使用您的用户名和密码存储一个 boolean 变量。默认设置值为false。

第一次成功登录后,将其值设为 true。

然后只需在您的 Mainactivity 上检查它的值,如果为真则跳转到下一个活动,否则跳转到登录活动。

【讨论】:

  • 你认为它安全吗?
  • 当然可以,因为共享偏好始终存储在数据中。所以没有人可以从“设备”导入数据。您仍然不满意,那么您可以以加密形式存储用户名和密码。 @Swap-IOS-Android
【解决方案4】:

您可以在 SharedPreferences 中使用布尔值。

在登录前加载它以检查是否需要登录。

登录后保存。

【讨论】:

    【解决方案5】:

    使用共享首选项。 将值保存到 sharedpreferences 的代码:

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

    从 sharedpreferences 中获取价值的代码:

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

    您可以使用此值检查登录和注销。

    【讨论】:

      【解决方案6】:

      您可以通过几种不同的方式获得该行为,我更喜欢在共享首选项中设置一个标志。当用户登录并在应用程序启动时检查它,如果您获得用户不是 loggend 的默认值,否则您应该设置您的标志(我使用用户名)并避免登录部分。

      【讨论】:

        【解决方案7】:

        将用户数据保存在共享首选项中,直到用户注销。 用户注销后,从共享首选项中清除数据。

        【讨论】:

        • 用户是否能够在关闭应用程序且未注销的情况下保持会话?
        • 是的。他将能够。只有当他按下注销按钮时,您才会清除共享首选项。直到除非 sharedprefs 将在内部保存到您的应用程序。
        【解决方案8】:
        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;
            }
        }
        

        【讨论】:

          【解决方案9】:

          源代码

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

          在 android 中获取以前的登录 ID

          **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 
          

          【讨论】:

            【解决方案10】:

            使用这个类将帮助您存储所有类型的会话

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-03-28
              • 2014-10-27
              • 2011-03-03
              • 2013-08-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多