SharedPreferences不会在PreferenceActivity中保存/加载

时间:2011-06-27 23:55:18

标签: android sharedpreferences preferenceactivity preference taskmanager

编辑: 下面描述的问题是由于任何编码相关问题引起的非常特殊的设备问题。

我有一个preferenceActivity,其中有很多checkBoxPreferences。 checkBoxPreference假设保存默认的共享首选项文件,然后在我打开应用程序时再次调用以更新UI。

这不会像它想象的那样发生。 如果我关闭应用程序并将其重新打开,我的值仍然像他们想象的那样,但如果我使用任务管理器来结束应用程序,或者如果我重新启动手机(当应用程序未运行时),则调用defaultValues试。

所以,我在onResume()中创建了一个SharedPreference来测试它。

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

然后检查该共享偏好中是否有密钥。

pref.contains("myCheckBoxPreference");

当我关闭并重新打开时,它返回true。如果我与任务管理器关闭或关闭和打开电话,那么返回false。

所以,我尝试手动设置SharedPreference

SharedPreferences.Editor editor = pref.edit();
editor.putBoolean("myCheckBoxPreference", myCheckBoxPreference.isChecked());
editor.commit();

然后我在checkboxpreference值更改时调用了它。我也尝试在onStop和onPause中调用它。尽管如此,如果我关闭应用程序并将其重新打开,pref.contains将返回true,但如果我关闭并重新启动手机,它将返回false。

所以我尝试使用SharedPreferences文件。

在班级宣言中:

public static final String PREFS = "prefs";

在onResume()中:

SharedPreferences pref = this.getSharedPreferences(PREFS, 0);

同样的行为,如果我只是关闭应用程序并将其重新打开,pref.contains仍会返回true,但如果我关闭手机并重新打开它,则返回false。

然后我尝试将myCheckBoxPreference的键值更改为与CheckBoxPreference的xml键不匹配的值,它仍然具有相同的效果。

我从手机上卸下了应用程序,然后打开电源并重新打开,然后重新安装,它仍然具有相同的效果。

7 个答案:

答案 0 :(得分:7)

我刚解决了,我很确定。我的代码没有任何代码错误,我的应用程序也没有任何问题(无论如何我都不相信。)

我创建了一个名为“testproj”的新项目,然后我从我的设置PreferenceActivity中复制了所有代码,将其粘贴到TestprojActivity中,然后我从它依赖的xml中复制了代码,然后将其粘贴到main.xml中TestProj。

然后我在Samsung Captivate上安装了TestProj,更改了设置,通过RAM管理(我自定义ROM的功能)清除了RAM,并且设置卡住了。然后我重新启动电话,设置仍然存在,就像我配置它们一样。

当我使用手动设置它们时,它们都保留了下来:

PreferenceManager.getDefaultSharedPreferences();

并且无需手动将其保存到SharedPreferences。

由于它不是我的手机,我还没有尝试过,但我认为工厂数据重置会完全修复它 编辑:我能够测试新的三星Captivate和三星注入,它有效。

我浪费了很多时间来解决这个问题,我希望它可以帮助别人。 :)

答案 1 :(得分:6)

我在Samsung Galaxy S上遇到了类似的问题,其中首选项XML文件的权限以某种方式更改/损坏。

日志显示某些主机进程无法读取文件,导致所有设置重置为默认值。我不记得确切的错误消息,但它是“对/path/to/preferences/file.xml拒绝的权限”。

我的解决方案是通过设置,应用程序,管理应用程序,MyApp,删除数据来删除应用程序数据。这会删除与应用程序关联的首选项文件,问题会立即消失。

我认为这是一个孤立的事件,因为我没有在各种Android设备(包括Galaxy S II)上再次遇到它。

答案 2 :(得分:3)

在客户端的主要测试设备上,我遇到了同样的问题。使用的设备是三星Galaxy S,SDK级别为8(2.2.1)。

奇怪的行为是SharedPreferences未保存,或者,因为工厂重置后,它们过于持久,也就是说在重新安装应用程序后它们不会被删除。

由于2.2.x的当前distribution,以及销售的三星Galaxy S设备数量达数百万,因此发生此问题的可能性很大

因此,实施保存首选项的解决方法至关重要。

为了收集详细的特征以便以尖锐的方式隔离此变通方法,那么每个也面临该问题的人都可以提供相应的内核版本System.getProperty("os.version")吗?

我在考虑这样的事情:

// !! I know that 2.6.32.9 is not yet correct. This would be a false positive !!
if ((System.getProperty("os.version").startsWith("2.6.32.9"))
    && (android.os.Build.DEVICE.contains("GT-I9000")))
    useInternalStorage();
else
    useSharedPreferences();

我可以在这里发布真实代码,一旦它准备就绪并且有人感兴趣。


编辑:其他一些信息:

面临该问题的设备:     

    Property                         | Values
    ---------------------------------+------------------------------------
    Build.DEVICE                     | "GT-I9000T"
    Build.VERSION.INCREMENTAL        | "UBJP9"
    Build.VERSION.RELEASE            | "2.2.1"
    Build.VERSION.SDK                | 8
    System.getProperty("os.version") | "2.6.32.9"
    

类似设备不面临该问题:     

    Property                         | Values
    ---------------------------------+------------------------------------
    Build.DEVICE                     | "GT-I9000"
    Build.VERSION.INCREMENTAL        | "AOJP4"
    Build.VERSION.RELEASE            | "2.2"
    Build.VERSION.SDK                | 8
    System.getProperty("os.version") | "2.6.32.9"
    

答案 3 :(得分:2)

在设置值之前尝试清除编辑器。我有同样的问题,它对我有用。 例如:

Editor e = PreferenceManager.getDefaultSharedPreferences(getParent()).edit();
e.clear();
e.putStringSet(key, value);

答案 4 :(得分:0)

可以使用sharedUserId解决权限问题,对于任何已签名的应用程序,这应该是相同的。

http://developer.android.com/reference/android/R.attr.html#sharedUserId

答案 5 :(得分:0)

我在保存然后检索数据方面也遇到了问题。我在扩展Application的类中使用了Save和Load代码,因为我想要一个单一的数据实例。我可以看到保存的字符串,在LogCat中没有错误,但是当我尝试加载它时,再次没有错误,我的字符串是空的。我从未检查数据是否实际进入文件,所以我不知道Save或Load或两者都有失败。

我的代码或多或少如下:( comboToSave只是Gson从简单数据类生成的字符串)

在一种方法中保存:

  SharedPreferences sharedPref = activity.getPreferences(Context.MODE_PRIVATE); 
  SharedPreferences.Editor editor = sharedPref.edit();
  editor.putString(getString(R.string.prefCombos), comboToSave); 
  editor.commit();

另一种加载方法:

  SharedPreferences sharedPref = activity.getPreferences(Context.MODE_PRIVATE);
  String loadedComboText = sharedPref.getString(getString(R.string.prefCombos), "");

经过大量的抓挠并且不知道该怎么做后,我更改了从

中检索sharedPref值的代码

SharedPreferences sharedPref = activity.getPreferences(Context.MODE_PRIVATE);

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

两者之间的差异还有一些here(虽然在我的情况下似乎完全相同)

仍然是我的Galaxy S3的结果是一样的。但是,在其他设备(包括VD(虚拟设备))上测试这两个版本都有效。

在代码的第一个版本中,我从调用活动传递了Activity;用于从用户收集最终数据位的活动中保存,以及从我的主活动加载以便在应用程序启动时准备就绪。

我玩了uninsalling应用程序并重新安装,昨晚关闭并重新打开设备无济于事。

我现在已经将save和load方法从应用程序类移动到我完成输入的活动,即加载和保存代码现在都在同一个活动中。我已经使用代码的两种变体对它进行了测试,它们都有效。我收回了我保存的东西。然后我将所有代码移回Application类并且它可以工作;这让我相信,不知怎的,所有的安装/卸载我都设法让它工作。 点是:代码是正确的 - 如果它不起作用,设备和/或设置可能应该归咎于

答案 6 :(得分:0)

我有同样的问题,我遭受了一段时间的困扰,最后我找到了解决方案, 它很容易,只需传递活动的直接引用,不要使用任何一般上下文

public SessionManagment(Activity mContextActivity){
//  this.contextActivity = mContext;
    sharedPrefSession =  mContextActivity.getSharedPreferences(
            Constants.SHARED_PREFERANCES_LIGHT_TIGER_SESSION_FILE_NAME, 
            Context.MODE_PRIVATE);

}//enden constructor 

上面的代码是我为会话管理编写的类的构造函数,以及 当我在AsyncTask中的主ActivityFramgment中的代码中调用它时,我称之为

SessionManagment sessionManagment = new SessionManagment(referanct2thisActivity);

其中referanct2thisActivity在片段活动的“onCreate”函数中定义,如下所示

referanct2thisActivity = this;

希望将来能帮助别人