SharedPreferences注销不起作用

时间:2017-06-05 16:22:48

标签: java android

我有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);
}

这里的问题是当我点击退出按钮时,我只是继续重定向到主页。

6 个答案:

答案 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)

只需使用SharedPreferenceslogged_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();

希望这会有所帮助〜