即使在清除之后,仍然可以从共享首选项中读取值

时间:2012-09-11 09:28:51

标签: android sharedpreferences

我正在为SharedPreferences中的已登录用户存储身份验证令牌,并在注销时清除首选项。

private void doSignOut(){
    SharedPreferences pref= getSharedPreferences(Constants.SHARED_PREF_DIR, Context.MODE_PRIVATE);
    Editor editor = pref.edit();
    editor.clear();
    editor.apply();
    boolean isCleared = editor.commit();
    FLog.d("Is Pref cleared = " + isCleared);
    mDbHelper.onUpgrade(mDbHelper.getWritableDatabase(), 0, 0);
    mDbHelper.close();
    Intent intent = new Intent(this, SignInActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}

然后在我的SignInActivity我检查authToken

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
    ActionBar actionBar = getSupportActionBar();
    actionBar.hide();
    checkForSignIn();

}

private void checkForSignIn() {
    SharedPreferences pref = getSharedPreferences(Constants.SHARED_PREF_DIR, Context.MODE_PRIVATE);
    String authToken = pref.getString(Constants.SHARED_PREF_AUTH, null);
    if(null == authToken){
         showAnimations();
    } else {
        FLog.d("AuthToken already present " + authToken);
        Intent intent = new Intent(getApplicationContext(), com.ribbon.ribbon.MainNavigationActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
    }
}

问题在于,checkForSignIn() authToken不是null而是保留实际值。

我在退出之前检查首选项xml并且它包含值,而在注销后它被清除。

这里有什么问题?我错过了很明显的东西吗? 请帮忙。

3 个答案:

答案 0 :(得分:1)

最后,我得到了它的工作。问题是这两个活动是在不同的过程中(因为,我在我的应用程序中使用了多个MapView)。 docs中提到SharedPreferences不支持在不同进程下使用。所以我移动SignInActivity而另一个移动到同一个主流程中,现在效果很好。

在我身边这是一个非常明显的错误,不得不在这个问题上划了4个小时。所以这可能会帮助处于类似情况的人。

答案 1 :(得分:0)

   Editor editor = pref.edit();
    editor.remove(Constants.SHARED_PREF_AUTH);
editor.commit();

会做

答案 2 :(得分:0)

尝试自己设置字符串为null:

editor.putString(Constants.SHARED_PREF_AUTH, null);