当应用程序强制关闭或设备重新启动时,共享首选项会重置数据

时间:2013-03-12 05:23:39

标签: android sharedpreferences

我正在开发一个应用程序,我将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);

到目前为止,一切正常。 我再次说明我的问题,当我强制关闭或重启我的设备时,我得到空值。我们可以将它永久存储在应用程序内存中吗?或者,我在这里做错了什么?

任何帮助将不胜感激。

6 个答案:

答案 0 :(得分:8)

我有一个登录屏幕,希望应用程序看起来好像在应用程序关闭/销毁/电话呼叫等后仍然在内部屏幕上“登录”。

我有一个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();

在活动的onResume()中: (即在内部屏幕内)

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 :(得分:6)

嗨! 解决方案对我有用!

Solution 1 Solution 2

解决方案1:

Intent myIntent = new Intent(this,Q1.class);

解决方案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)*/
   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 :(得分:1)

更改为:

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可以是你想要的任何东西,小写字母,开头没有数字等等。

答案 3 :(得分:0)

请参阅下面的内容。

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


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

这很好用。 数据将保留在Sharedprefrences中,直到不会重新安装应用程序或直到不清除数据为止。

我以这种方式检索数据。

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

答案 4 :(得分:0)

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

// 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;
        }

答案 5 :(得分:-1)

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

           try {
                Context context = MainActivity.this;
                OutputStreamWriter out=
                        new OutputStreamWriter(context.openFileOutput(EMAILLOGIN, 0));

                out.write(email_text);                   
                out.write("\r\n");
                out.write(userIDToken);                   
                out.write("\r\n");
                out.write(accessToken);                   
                out.write("\r\n");

                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();
                }
            }

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