我有2项活动,身份验证和主页。
在身份验证中,它会检查用户是否已登录,如果用户已登录,将重定向到Mainpage.class。这是身份验证检查用户是否已登录并重定向的方式。
SharedPreferences blockSession = this.getSharedPreferences("blockSession", 0);
boolean isLoggedIn = blockSession.getBoolean("logged_in", false);
if(isLoggedIn){
Intent intent = new Intent(this, Mainpage.class);
startActivity(intent);
}
在主页中,我有一个按钮,它是一个退出按钮和 onClick 事件,它使用我创建的 logOut 功能。这是注销按钮的工作原理:
void logOut(){
SharedPreferences blockSession = this.getSharedPreferences("blockSession", 0);
SharedPreferences.Editor blockEdit = blockSession.edit();
blockEdit.clear();
blockEdit.apply();
finish();
Intent intent = new Intent(Mainpage.this, Authentication.class);
startActivity(intent);
}
这里的问题是当我点击退出按钮时,我只是继续重定向到主页。
答案 0 :(得分:1)
问题是你在开始Intent之前完成了活动。这就是为什么它在调用MainPage
时显示logout()
的原因。相反,你必须在完成后才能完成活动。意图被称为。
因此,请按以下方式替换您的代码
void logOut(){
SharedPreferences blockSession = this.getSharedPreferences("blockSession", 0);
SharedPreferences.Editor blockEdit = blockSession.edit();
blockEdit.clear();
blockEdit.apply();
//finish(); /****<-----commented out this line---****/
Intent intent = new Intent(Mainpage.this, Authentication.class);
startActivity(intent);
finish(); /****<------Moved to here---****/
}
<强>更新强>
由于您在onClick
中为该按钮添加了xml
属性,但您收到错误
java.lang.IllegalStateException:找不到方法logOut(View) 一个父或祖先上下文为android:onClick属性定义 查看具有id的类android.support.v7.widget.AppCompatButton &#39; logoutButton&#39;
按以下步骤更换您的功能
void logOut(View v){
SharedPreferences blockSession = this.getSharedPreferences("blockSession", 0);
SharedPreferences.Editor blockEdit = blockSession.edit();
blockEdit.clear();
blockEdit.apply();
//finish(); /****<-----commented out this line---****/
Intent intent = new Intent(Mainpage.this, Authentication.class);
startActivity(intent);
finish(); /****<------Moved to here---****/
}
但是,我认为解决这个问题不是一个好主意。您应该在适配器或片段中实现onClickListener。
答案 1 :(得分:0)
试试这个,希望有所帮助
void logOut(){
SharedPreferences blockSession = this.getSharedPreferences("blockSession", 0);
SharedPreferences.Editor blockEdit = blockSession.edit();
blockEdit.clear();
blockEdit.commit(); // to apply the changes
finish();
Intent intent = new Intent(Mainpage.this, Authentication.class);
startActivity(intent);
}
答案 2 :(得分:0)
试试吧。
SharedPreferences mySPref = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = mySPrefs.edit();
editor.remove(String key);
editor.apply();
答案 3 :(得分:0)
替换你的这行代码
blockEdit.apply();
与
blockEdit.commit();
跟随您的活动呼叫意图。希望它有所帮助。
答案 4 :(得分:0)
将finish()放在你的代码中
SharedPreferences blockSession = this.getSharedPreferences("blockSession", 0);
boolean isLoggedIn = blockSession.getBoolean("logged_in", false);
if(isLoggedIn){
Intent intent = new Intent(this, Mainpage.class);
startActivity(intent);
finish();
}
的更新强>
我查看了你的代码并发现了一个小错误:
在您使用的OnCreate方法中:
SharedPreferences blockSession = PreferenceManager.getDefaultSharedPreferences(this);
boolean isLoggedIn = blockSession.getBoolean("logged_in", false);
if(!isLoggedIn){
Intent intent = new Intent(this, Mainpage.class);
startActivity(intent);
finish();
}
错误:
您在create方法中获取了sharedPreference值但是当您在注销时清除sharedPreference时,它没有任何削弱的sharedPreference值。因此,您在此处提到的默认值为false:
boolean isLoggedIn = blockSession.getBoolean("logged_in", false); // false is default value.
如果条件总是正确,那么你就是因为每次退出时都有假值。
解决方案:
如果条件改变如下:
if(isLoggedIn){
Intent intent = new Intent(this, Mainpage.class);
startActivity(intent);
finish();
}
答案 5 :(得分:0)
只需使用SharedPreferences
和logged_in
将您的false
密钥blockEdit.putBoolean("logged_in", false)
值重置为commit
。
试试这个:
void logOut(View view) {
SharedPreferences blockSession = this.getSharedPreferences("blockSession", 0);
SharedPreferences.Editor blockEdit = blockSession.edit();
// Set logged_in value to false
blockEdit.putBoolean("logged_in", false);
blockEdit.commit();
// Start Authentication
Intent intent = new Intent(Mainpage.this, Authentication.class);
startActivity(intent);
// Finish MainPage
finish();
}
#。最佳做法是为class
管理层创建一个公共session
,并根据您的需要在应用程序的任何位置使用此功能。
创建一个SessionManager
类,如下所示:
public class SessionManager {
// LogCat tag
private static String TAG = SessionManager.class.getSimpleName();
Context context;
// Shared Preferences
SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;
// Shared pref mode
int PRIVATE_MODE = 0;
// Shared preferences file name
private static final String PREF_NAME = "MY_APP";
private static final String KEY_IS_LOGGED_IN = "IS_LOGGED_IN";
private static final String KEY_USER_ID = "USER_ID";
private static final String KEY_USER_EMAIL = "USER_EMAIL";
private static final String KEY_USER_USERNAME = "USER_USERNAME";
public SessionManager(Context context) {
this.context = context;
sharedPreferences = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = sharedPreferences.edit();
}
public void setLogin(boolean isLoggedIn) {
editor.putBoolean(KEY_IS_LOGGED_IN, isLoggedIn);
// commit changes
editor.commit();
Log.d(TAG, "User login session modified!");
}
public boolean isLoggedIn() {
return sharedPreferences.getBoolean(KEY_IS_LOGGED_IN, false);
}
public void setUserId(int id) {
editor.putInt(KEY_USER_ID, id);
editor.commit();
}
public int getUserId() {
return sharedPreferences.getInt(KEY_USER_ID, 0);
}
public void setUsername(String username) {
editor.putString(KEY_USER_USERNAME, username);
editor.commit();
}
public String getUsername() {
return sharedPreferences.getString(KEY_USER_USERNAME, "user1234");
}
public void setEmail(String email) {
editor.putString(KEY_USER_EMAIL, email);
editor.commit();
}
public String getEmail() {
return sharedPreferences.getString(KEY_USER_EMAIL, "default@gmail.com");
}
}
使用:强>
<强> LOGIN:强>
SessionManager sessionManager = new SessionManager(getApplicationContext());
sessionManager.setLogin(true);
sessionManager.setUserId(userId);
// Launch MainPage
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
<强> LOGOUT:强>
SessionManager sessionManager = new SessionManager(getApplicationContext());
sessionManager.setLogin(false);
// Launch LoginPage
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
startActivity(intent);
finish();
希望这会有所帮助〜