我应该如何存储用户凭据,以便用户不必再次登录?

时间:2014-11-26 07:57:36

标签: java android android-activity android-5.0-lollipop

我有两项活动:LoginMain

我还有在活动之前运行的App课程。

public class App extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
    }
}

我的AndroidManifest.xml使Login活动成为第一个要运行的活动。

我应该转到Login活动,检查SharedPreferences然后确定用户是否已登录?

或者我应该制作一个空白的活动进行检查,然后启动正确的活动,LoginMain

或者也许应该在App课程中进行检查,并对Android Manifest进行更改。

因此,这不会成为意见盛会,任何建议都必须有合理的理由,以及为什么它最好

6 个答案:

答案 0 :(得分:1)

好的解决方案是创建用于保存会话信息的新类,例如:

public class SessionManager {
// Shared Preferences
SharedPreferences pref;

// Editor
Editor editor;

// Context
Context mContext;

// Shared pref mode
int PRIVATE_MODE = 0;

// Sharedpref file name
private static final String PREF_NAME = "MyPref";

// All Shared Preferences Keys
private static final String IS_LOGIN = "IsLoggedIn";
private static final String KEY_EMAIL = "email";
private static final String KEY_ID = "id";

// Constructor
public SessionManager(Context context) {
    this.mContext = context;
    pref = mContext.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
    editor = pref.edit();
}

/**
 * Create login session
 */
public void createLoginSession(String email, int id) {
    // Storing login value as TRUE
    editor.putBoolean(IS_LOGIN, true);

    // Storing email in pref
    editor.putString(KEY_EMAIL, email);

    // Storing id in pref
    editor.putInt(KEY_ID, id);

    // 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(mContext, LoginActivity.class);

        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

        // Staring Login Activity
        mContext.startActivity(i);
    }

}


/**
 * Quick check for login
 * *
 */
// Get Login State
public boolean isLoggedIn() {
    return pref.getBoolean(IS_LOGIN, false);
}

public int getId() {
    return pref.getInt(KEY_ID, 0);
}
}

在您的MainActivity中,您必须检查用户是否已登录:

public class MainActivity extends Activity {

// Session Manager Class
SessionManager session;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    // Session class instance
    session = new SessionManager(getApplicationContext());
    session.checkLogin();
.
 // code goes here
 ...

如果用户未登录,他将被重定向到LoginActivity。

在LoginActivity中,只需查看电子邮件/通行证等等,...致电:

session.createLoginSession(mEmail, mId);

并将用户重定向回MainActivity

答案 1 :(得分:0)

检查SharedPreferences中的登录需要一点时间,如果您通过空白活动实施此检查,您的应用的启动时间将无缘无故增加(启动2次活动而不是1次活动)

您可以检查MainActivity,如果失败则运行LoginActivity

答案 2 :(得分:0)

你是如何处理注册的?整个登录/注册/身份验证流程虽然看似简单,但在考虑多个同时登录,密码更改,忘记密码,帐户删除等问题时,可能会出现相当复杂的边缘情况。也就是说,Android提供了{{ 3}}专为此目的而设计,AccountManager是有关如何使用它的更好教程之一。

答案 3 :(得分:0)

您可以在加载应用程序时查看启动画面,并在此时检查用户名和密码。 或者您可以将带有充电指示器的主屏幕上传到用户知道正在进行的操作并且应用程序没有卡住。

答案 4 :(得分:0)

第一种方法:

我建议你选择碎片。

启动MainActivity,在onCreate()内查看用户的登录会话是否有效,如果有效则使用您的正常工作流程,否则启动您的LoginFragment

第二种方法:

使用SplashActivity,检查您的登录用户会话有效性并确定工作流程

第三种方法

假设用户已登录,并在MainActivity内启动onCreate()检查您的用户会话有效性,如果无效,则启动LoginActivityfinish()您的MainActivity }

毫无疑问,第一个可能是你最好的选择,但我应该把这个决定留给你。 :)

答案 5 :(得分:0)

将凭据保存在您身上。最好将它保存在安全的地方并进行编码; )

有许多可能的解决方案:

1)Splashscreen 从理论上讲,我们不应该使用闪屏:P 但在这种情况下,它将非常容易;)

Intent mIntentMain = ...
Intent mIntentLogin = ...
boolean mIsUserLogged = ...
startActvity(mIsUserLogged ? mIntentMain : mIntentLogin);

2)主要活动 启动主要活动,然后在使用数据,ws调用等填充屏幕之前,在onCreate之后,检查凭据;)如果它 好的 - >开始解析数据/填充内容 别的 - >完成主要活动,显示吐司,开放登录活动

3)碎片 活动主要 - >检查凭据 - >放入登录片段或主要片段