我正在开发一个应用程序,其中我将username
和password
存储在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
对象来保存Login
或Register
之后的值。我在所有关键屏幕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();
}
}
这将确保即使当你的应用程序强制关闭或如果你的设备重启,你仍然可以从文件中读取所需的值