【问题标题】:SharedPreferences not getting cleared androidSharedPreferences没有被清除android
【发布时间】:2014-06-22 13:53:21
【问题描述】:

我的应用中有登录功能。在这里,当用户第一次登录时,用户详细信息保存在共享首选项文件中。当用户下次登录时,用户将直接定向到第二个屏幕。这工作正常。现在我已经实现了注销功能。在这里,我清除了偏好。然后,如果我从另一个帐户登录,我仍然会获得第一个帐户的用户详细信息。

这是我的代码:-

   public class SessionManagement
{
     SharedPreferences pref;

        // Editor for Shared preferences
        SharedPreferences.Editor editor;

        // ContextS
        Context _context;

        // Shared pref mode
        int PRIVATE_MODE = 0;

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

        // All Shared Preferences Keys
        private static final String IS_LOGIN = "IsLoggedIn";

        // User name (make variable public to access from outside)
        public static final String KEY_EMAILID = "email";

        // Email address (make variable public to access from outside)
        public static final String KEY_DEVICEURL = "deviceurl";

        public static final String KEY_ENDPOINTHOST = "endpointhost";
        public static final String KEY_DEVICENAME = "devicename";
        public static final String KEY_USERSNAME = "usersname";
        public static final String KEY_ENCODEDACCOUNTNAME = "encodedaccountname";
        public static final String KEY_HOSTURL = "hosturl";
        public static final String KEY_DEVICEiD = "deviceid";

        public static final String  KEY_DEVICEREGISTERED = "deviceregistered";
        // Constructor
         static SessionManagement session = null;

    public static SessionManagement  getInstance(Context context)
    {
    _context = context;
    if(session == null)
        session = new SessionManagement ();
    return session;
    }
    public SessionManagement()
    {

        pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
        editor = pref.edit();
    }

        public void createLoginSession(String emailId, String deviceauthurl, String deviceid, String endpointhost, String devicename, String usersname, String encodedaccountname, String hosturl)
        {
            // Storing login value as TRUE
            editor.putBoolean(IS_LOGIN, true);

            editor.putBoolean(KEY_DEVICEREGISTERED, true);
            editor.putString(KEY_EMAILID, emailId);
            editor.putString(KEY_DEVICEURL, deviceurl);
            editor.putString(KEY_DEVICEiD, deviceid);
            editor.putString(KEY_ENDPOINTHOST, endpointhost);
            editor.putString(KEY_DEVICENAME,devicename);
            editor.putString(KEY_USERSNAME, usersname);
            editor.putString(KEY_ENCODEDACCOUNTNAME, encodedaccountname);
            editor.putString(KEY_HOSTURL, hosturl);

            // commit changes
            editor.commit();
        }

        /**
         * Get stored session data
         * */
        public HashMap<String, String> getUserDetails()
        {
            HashMap<String, String> user = new HashMap<String, String>();

            user.put(KEY_EMAILID, pref.getString(KEY_EMAILID, null));
             user.put(KEY_DEVICEAUTHURL, pref.getString(KEY_DEVICEAUTHURL, null));
            user.put(KEY_DEVICEiD, pref.getString(KEY_DEVICEiD, null));
            user.put(KEY_ENDPOINTHOST, pref.getString(KEY_ENDPOINTHOST, null));
            user.put(KEY_DEVICENAME, pref.getString(KEY_DEVICENAME, null));
            user.put(KEY_USERSNAME, pref.getString(KEY_USERSNAME, null));
            user.put(KEY_ENCODEDACCOUNTNAME, pref.getString(KEY_ENCODEDACCOUNTNAME, null));
            user.put(KEY_HOSTURL, pref.getString(KEY_HOSTURL, null));

            // return user
            return user;

        }
        /**
         * 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(_context, Login.class);
                // Closing all the Activities
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

                // Add new Flag to start new Activity
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

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

        }

       // This function clears all session data and redirect the user to LoginActivity
        /**
             * Clear session details
             * */
            public void logoutUser()
            {
                // Clearing all data from Shared Preferences
                //editor.clear();
                editor.remove(KEY_DEVICEURL);
                editor.remove(KEY_DEVICENAME);
                editor.remove(KEY_DEVICEREGISTERED);
                editor.remove(KEY_DEVICEiD);
                editor.remove(KEY_EMAILID);
                editor.remove(KEY_ENCODEDACCOUNTNAME);
                editor.remove(KEY_ENDPOINTHOST);
                editor.remove(KEY_HOSTURL);
                editor.remove(KEY_USERSNAME);
                editor.remove(IS_LOGIN);
                editor.remove(PREF_NAME);
                editor.clear();
                editor.commit();


                File file = new File("/data/data/com.zcv.acb/shared_prefs/UserDetails.xml");
                file.delete();


                // After logout redirect user to Loing Activity
                Intent i = new Intent(_context, Login.class);
                // Closing all the Activities
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

                // Add new Flag to start new Activity
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                // Staring Login Activity
                _context.startActivity(i);

            }

            public boolean isLoggedIn()
            {
                return pref.getBoolean(IS_LOGIN, false);
            }
}

登录.java

    SessionManagement sessionManager =SessionManagement.getInstance(this);
        session.logoutUser();
sessionManager.createLoginSession(username, deviceUrl, deviceId, endPointHost, deviceName, name, encodedAccountNameToken, hostUrlToken);
   if(sessionManager.isLoggedIn())
      {
          //Go directly to main activity
         HashMap<String, String> userDetails = sessionManager.getUserDetails();

        startMyActivity();
        finish();   
      }

注销.java

SessionManagement session =SessionManagement.getInstance(this);
        session.logoutUser();
            this.finish();

有什么建议吗?

【问题讨论】:

    标签: java android sharedpreferences logout


    【解决方案1】:

    用于保存共享首选项

    保存共享偏好以这种方式调用savePreference("Username","some name");

    删除共享偏好以这种方式调用savePreference("Username","");

    private void savePreferences(String key, String value) 
    {
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        Editor editor = sharedPreferences.edit();
        editor.putString(key, value);
        editor.commit();
    }
    

    获取共享偏好

    现在,当您获得 empty String 时检查首选项时将用户重定向到登录 Activity。否则到用户屏幕

    private boolean loadSavedPreferences() 
    {
        boolean check=false;
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        String name = sharedPreferences.getString("Username", "");
        if(!name.equals(""))
        {
            check = true;
        }
        return check;
    }
    

    这很简单。

    更新:2

    public void createLoginSession(String emailId, String deviceauthurl, String deviceid, String endpointhost, String devicename, String usersname, String encodedaccountname, String hosturl)
        {
            // Storing login value as TRUE
            savePreferences(IS_LOGIN, true);
    
            savePreferences(KEY_DEVICEREGISTERED, true);
            savePreferences(KEY_EMAILID, emailId);
            savePreferences(KEY_DEVICEURL, deviceurl);
            savePreferences(KEY_DEVICEiD, deviceid);
            savePreferences(KEY_ENDPOINTHOST, endpointhost);
            savePreferences(KEY_DEVICENAME,devicename);
            savePreferences(KEY_USERSNAME, usersname);
            savePreferences(KEY_ENCODEDACCOUNTNAME, encodedaccountname);
            savePreferences(KEY_HOSTURL, hosturl);
    
        }
    

    记住一件事。 savePreference 只接受 (String,String) 您需要为 (String,boolean) 创建一个

    【讨论】:

    • 问题是关于删除共享首选项
    • 我如何使用 LoadsavedPreference() 注销然后
    • 当您加载首选项时,如果您全部为空,则需要将其传递给登录。
    • 不工作。当我点击注销按钮时,共享首选项文件有一个包含 0 个元素的地图。但后来我仍然得到以前的用户详细信息
    • 可能是你做错了,把你的项目发邮件给我,我会改正给你的
    【解决方案2】:

    问题是,您正在使用 2 个不同的会话管理对象,即登录有不同的对象,注销有不同的会话管理对象。这就是为什么它不工作。它们都属于不同的共享偏好对象。当您初始化注销对象时,会再创建一个共享首选项对象。解决此问题的方法是使用单例对象或使用静态方法和成员来解决您的问题。但我想单例对此会有好处。像这样修改你的代码:

    public class SessionManagement {
    static SessionManagement man = null;
    
    public static SessionManagement  getInstance(){
    if(man == null)
       man = new SessionManagement ();
    return man;
    }
    
    ...
    
    }
    

    并使您的类构造函数私有(只需删除公共并在您的构造函数中替换为私有)

    在此之后所有代码保持不变。

    现在在登录活动和注销活动中,通过调用这个来获取你的对象

    SessionManagement sess = SessionManagement.getInstance();
    

    【讨论】:

    • 我试过你的答案,但对于 sharedpreferneces 我需要一个上下文。如何使用上下文?
    • 您可以将上下文作为参数传递给getInstance。
    【解决方案3】:
        brother use this method to remove the string shared preference:
    
            public static void removeSharedPrefStringData(Context context, String key)
            {
    
                SharedPreferences appInstallInfoSharedPref = context.getSharedPreferences(Constant.SHARED_PREF_NAME, context.MODE_MULTI_PROCESS);
    
                Editor appInstallInfoEditor = appInstallInfoSharedPref.edit();
                appInstallInfoEditor.remove(key);
                appInstallInfoEditor.commit();
    
            }
    
    set and get preference methods are here:
    
        public static void setSharedPrefStringData(Context context, String key, String value)
        {
            SharedPreferences appInstallInfoSharedPref = context.getSharedPreferences(Constant.SHARED_PREF_NAME, context.MODE_MULTI_PROCESS);
            Editor appInstallInfoEditor = appInstallInfoSharedPref.edit();
            appInstallInfoEditor.putString(key, value);
            appInstallInfoEditor.commit();
        }
    
        public static String getSharedPrefStringData(Context context, String key)
        {
    
            SharedPreferences userAcountPreference = context.getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_MULTI_PROCESS);
    
            return userAcountPreference.getString(key, "");
    
        }
    

    【讨论】:

    • @raj 你想问什么??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2013-07-21
    • 2014-08-01
    • 2013-03-06
    • 1970-01-01
    相关资源
    最近更新 更多