Android 如何只显示一次登录屏幕?

Android 如何只显示一次登录屏幕?,android,Android,我正在创建一个项目,其中有一个登录屏幕,用于用户登录 应用此登录屏幕应仅在第一次时可见,以便用户可以填写并登录,但当用户在第二次打开应用程序时,应用程序必须显示main.activity。如何使用 我不知道该怎么做 使用SharedReferences。例如,保存一些值,并在登录活动中读取 在我们的项目中,我们保存令牌和用户id。所以,若用户已经登录,我们跳过授权活动 注意:如果您的登录活动是应用程序中的第一个登录活动,那么在开始另一个活动之前,不要忘记完成它,以防止在其他活动中按“后退”键。要

我正在创建一个项目,其中有一个登录屏幕,用于用户登录
应用此登录屏幕应仅在第一次时可见,以便用户可以填写并登录,但当用户在第二次打开应用程序时,应用程序必须显示main.activity。如何使用


我不知道该怎么做

使用
SharedReferences
。例如,保存一些值,并在登录活动中读取

在我们的项目中,我们保存令牌和用户id。所以,若用户已经登录,我们跳过授权活动


注意:如果您的登录活动是应用程序中的第一个登录活动,那么在开始另一个活动之前,不要忘记完成它,以防止在其他活动中按“后退”键。

要通过
共享参考来实现这一点,您可以执行以下操作:

在您认为更合适的任何类中插入以下内容。假设您在类
示例
中插入此项

//Give your SharedPreferences file a name and save it to a static variable
public static final String PREFS_NAME = "MyPrefsFile";
现在,在评估用户是否成功登录的方法中,执行以下操作。注意
示例
类,您必须更改它以匹配您的代码

//User has successfully logged in, save this information
// We need an Editor object to make preference changes.
SharedPreferences settings = getSharedPreferences(Example.PREFS_NAME, 0); // 0 - for private mode
SharedPreferences.Editor editor = settings.edit();

//Set "hasLoggedIn" to true
editor.putBoolean("hasLoggedIn", true);

// Commit the edits!
editor.commit();
最后,当应用程序启动时您现在可以评估用户是否已登录。仍然注意必须更改的
示例

SharedPreferences settings = getSharedPreferences(Example.PREFS_NAME, 0);
//Get "hasLoggedIn" value. If the value doesn't exist yet false is returned
boolean hasLoggedIn = settings.getBoolean("hasLoggedIn", false);

if(hasLoggedIn)
{
    //Go directly to main activity.
}
希望这有帮助

编辑:要防止用户使用“后退”按钮返回登录活动,您必须在启动新活动后
finish()
该活动

以下代码取自

因此,在代码中要做的是在调用
startActivity()
之后,调用登录活动上的
finish()
函数


另请参见:

使用共享引用。例如,拥有一个布尔变量,并在应用程序启动时读取它。 在您的情况下,当用户第一次启动应用程序时,共享首选项中的变量将为false,因此启动登录屏幕并在成功登录后,在共享首选项中将该布尔变量设置为true,这样当用户第二次来时,共享首选项中的值将为true。因此,跳过登录屏幕并启动您的主要活动

要在SharedReference中存储布尔值,请使用以下代码:

public static void saveBooleanInSP(Context _context, boolean value){
SharedPreferences preferences = _context.getSharedPreferences("PROJECTNAME", android.content.Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("ISLOGGEDIN", value);
editor.commit();
}//savePWDInSP()
public static boolean getBooleanFromSP(Context _context) {
// TODO Auto-generated method stub
SharedPreferences preferences = _context.getSharedPreferences("PROJECTNAME", android.content.Context.MODE_PRIVATE);
return preferences.getBoolean("ISLOGGEDIN", false);
}//getPWDFromSP()
要从SharedReference获取值,请使用以下代码:

public static void saveBooleanInSP(Context _context, boolean value){
SharedPreferences preferences = _context.getSharedPreferences("PROJECTNAME", android.content.Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("ISLOGGEDIN", value);
editor.commit();
}//savePWDInSP()
public static boolean getBooleanFromSP(Context _context) {
// TODO Auto-generated method stub
SharedPreferences preferences = _context.getSharedPreferences("PROJECTNAME", android.content.Context.MODE_PRIVATE);
return preferences.getBoolean("ISLOGGEDIN", false);
}//getPWDFromSP()

您应该先添加另一个加载的空活动(没有UI)

将@Telmo Marques描述的逻辑放在这个空活动中,该活动负责将用户指向LoginScreen.activity或Main.activity

请看这里,由@tozka回答

使用令牌也是了解登录状态的好方法。在基于Oauth令牌的登录中,当用户登录到应用程序时,他们将在成功登录时获得访问令牌,并以安全的方式保存在帐户管理器中。然后,当用户打开应用程序时,首先检查令牌的可用性,如果可用重定向到登录活动的主页面其他位置。

我存储此值的位置表示在哪个活动上?用户1294970在用户首次登录时存储此值。您尝试与我们共享的链接格式不正确。请编辑您的问题以添加正确的链接。它在(Example.PREFS_NAME,0)上显示错误;我需要在哪个活动中添加此代码?@sandiparmal请仔细阅读我的答案,我声明您需要在何处插入代码。必须更改
示例
类以匹配创建
PREFS\u NAME
静态变量的类。即使在填充数据后,它仍然会在登录时跳转。我可以放置代码吗?@sandiparmal请随意编辑您的问题,向我们展示您的代码。如果您有大量的代码,请使用诸如粘贴代码之类的内容。@sandiparmal您必须在启动新的登录活动后
finish()
login活动。请看我的编辑。