当应用程序被强制关闭或设备重启时,共享偏好设置重置数据



我正在开发一个应用程序,其中我将usernamepassword存储在SharedPreferences中。所有的事情对我来说都很好,存储以及检索值。但我发现,当我重新启动设备或应用程序被强制关闭时,存储在SharedPreferences中的值被重置。当我再次启动我的应用程序时,我在SharedPreferences键中得到空值。下面是我为存储这些值所做的操作:

SharedPreferences emailLoginSP;
emailLoginSP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
emailLoginSP.edit().putString("prefEmailId", email_text).commit();
emailLoginSP.edit().putString("prefUserId", userIDToken).commit();
emailLoginSP.edit().putString("prefAccess_token", accessToken).commit();
Intent i = new Intent(LoginWithEmail.this,UserInfoActivity.class);
i.putExtra("acess_token", accessToken);
i.putExtra("user_id", userIDToken);
i.putExtra("emailID", email_text);
startActivity(i);

并且,这是我如何检索它:

SharedPreferences emailLoginSP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
loginEmail = emailLoginSP.getString("prefEmailId", null);
loginUserId = emailLoginSP.getString("prefUserId", null);
loginAccessToken = emailLoginSP.getString("prefAccess_token", null);
到目前为止,一切都很顺利。我再次说明我的问题,我得到空值时,我强制关闭或重新启动我的设备。我们能否将其永久存储在应用程序内存中?还是我做错了什么?

我有一个登录屏幕,并希望应用程序出现,如果它仍然"登录"在内部屏幕后,应用程序关闭/销毁/电话呼叫等。

我有一个Preferences对象来保存LoginRegister之后的值。我在所有关键屏幕onResume()方法中读取首选项值。

登录后(例如):

SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(activity);
SharedPreferences.Editor editor = app_preferences.edit();
editor.putString("sessionId", application.currentSessionId);
editor.putString("userId", application.currentUserId);
editor.putString("userEmail", application.currentUserEmail);
editor.putString("siteUserId", application.currentSiteUserId);
editor.commit();

Within onResume() of Activities:(即在内部屏幕内)

SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(activity);
application.currentSessionId = app_preferences.getString("sessionId", "");
application.currentUserId = app_preferences.getString("userId", "");
application.currentUserEmail = app_preferences.getString("userEmail", "");
application.currentSiteUserId = app_preferences.getString("siteUserId", "");

。我有应用程序的"全局"变量,即application.currentSessionId,你可以只替换你的变量

尝试类似的东西,也许你没有保存或检索正确的值,因为SharePreferences应该工作

大家好!解决方案,为我工作!

解决方案1解决方案2

解决方案1:

  SharedPreferences sharedPreferences = getSharedPreferences("namefile",               
    Context.MODE_PRIVATE);//store or retrieved file "namefile.xml".
    /*or 
   SharedPreferences sharedPreferences    
   =getActivity().getSharedPreferences("namefile", Context.MODE_PRIVATE); 
   (use Shared Preferences in Fragment)*/
   String getValueFromKey = sharedPreferences.getString("yourKey",new   
   String());
   //Log.d("printf:",getValueFromKey );
   getValueFromKey ="Hahaha"; /*  Edit value    
   or Do nothing …… */
   SharedPreferences.Editor editor = sharedPreferences.edit();
   editor.clear(); //[important] Clearing your editor before using it.
   editor.putString("yourKey", getValueFromKey);
   editor.commit();

解决方案2:

SharedPreferences sharedPreferences = getSharedPreferences("namefile",     
  Context.MODE_PRIVATE);//store or retrieved file "namefile.xml".
/*or 
SharedPreferences sharedPreferences = 
getActivity().getSharedPreferences("namefile", Context.MODE_PRIVATE); 
(use Shared Preferences in Fragment)
*/
Set<String> getListValueFromKey =
sharedPreferences.getStringSet("yourKey",new HashSet<String>());
getListValueFromKey.add("Hahaha");
getListValueFromKey.add("Kakaka");
getListValueFromKey.add("Hohoho");
/*  Add value or Do nothing …… */
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear(); //[important] Clearing your editor before using it.
editor.putStringSet("yourKey", getListValueFromKey);
editor.commit();

我遇到过和你完全一样的问题,这对我很有效。对于我的整个代码示例,请参见

更改为:

SharedPreferences emailLoginSP;
SharedPreferences.Editor SPEdit;
emailLoginSP = getSharedPreferences("pref_file_name",MODE_PRIVATE);
SPEdit = emailLoginSP.edit();
SPEdit.putString("prefEmailId", email_text);
SPEdit.putString("prefUserId", userIDToken);
SPEdit.putString("prefAccess_token", accessToken);
SPEdit.commit();

注意:这是未经测试的,从内存,所以可能有一个错误。

你想尽量减少.commit()调用,这就是为什么最后只有一个。

pref_file_name可以是任何你想要的,小写字母,开头没有数字等

确保使用相同的文件进行保存和检索。这让我看起来很傻:(

// When saving
public SharedPreferences.Editor getEditor(Activity activity, int mode) {
    SharedPreferences sharedPref = activity.getApplicationContext().getSharedPreferences(PreferenceConstants.SWAGGER_USER_PREFS, mode);
    SharedPreferences.Editor editor = sharedPref.edit();
    return editor;
}

// When getting it
    public SharedPreferences getSharedPref(Activity activity, int mode) {
            SharedPreferences sharedPref = activity.getSharedPreferences(PreferenceConstants.SWAGGER_USER_PREFS, mode);
            return sharedPref;
        }

看我已经这样做了

        sharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(getApplicationContext());
        editor = sharedPreferences.edit();
        isPaidVerison = sharedPreferences.getInt("isPaidVerison", 0);

        editor.putInt("isPaidVerison", 1);
        editor.commit();

这个很好。数据将保留在共享首选项中,直到不重新安装应用程序或直到不清除数据。

我用这种方式检索数据。

       isPaidVerison = sharedPreferences.getInt("isPaidVerison", 0);

如果您想尝试共享首选项以外的方法,那么您可以使用文件来编写值,然后从中检索值。声明一个文本文件emailLogin.txt,并按如下所示使用它来写入数据。

           try {
                Context context = MainActivity.this;
                OutputStreamWriter out=
                        new OutputStreamWriter(context.openFileOutput(EMAILLOGIN, 0));
                out.write(email_text);                   
                out.write("rn");
                out.write(userIDToken);                   
                out.write("rn");
                out.write(accessToken);                   
                out.write("rn");
                out.close();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 

写入文件后,您可以执行以下操作从文件中读取。

   File file = this.getFileStreamPath(EMAILLOGIN);
            if(file.exists())
            {
                try {
                    InputStream in=openFileInput(NUMBERS);
                    if (in!=null) {
                        InputStreamReader tmp=new InputStreamReader(in);
                        BufferedReader reader=new BufferedReader(tmp);
                        String str;
                        String strcount[]= new String[20];                                                        
                        java.util.Arrays.fill(strcount, 0, 10, "");
                        while ((str = reader.readLine()) != null) {                       
                            strcount[linecount]=str;                              
                        }
                        loginEmail = strcount[0];
                        loginUserId = strcount[1];
                        loginAccessToken = strcount[2];
                        in.close();              
                    }
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

这将确保即使当你的应用程序强制关闭或如果你的设备重启,你仍然可以从文件中读取所需的值

最新更新