安卓 getDefaultSharedPreferences

63

我的代码如下:

final String eulaKey = "mykey";
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
boolean hasBeenShown = prefs.getBoolean(eulaKey, false);

根据操作系统版本,始终返回不同的值。在2.2、2.3.4、3.2、4.0.3中测试,返回正确的值。但是对于装有CianogenMod 7.1的2.3.7版本的Zte blade设备,结果始终为false。我认为这是getBoolean的默认值。

以下是编写boolean的代码:

final String eulaKey = "mykey";
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(eulaKey, true);
editor.commit();

有人有任何想法吗?

更新: 将我当前的代码与以前版本的代码进行比较-代码没有任何差异。 唯一的区别在于清单:代码在minVersion=8和targetVersion=8情况下正常工作。 现在我正在编译minversion=8和target=13 /因为Admob/。 可能会更改某些API,但我没有找到任何信息。

解决��案: -从快捷方式和菜单启动应用程序会给我不同的DefaultSharedPreferences。删除代码中的DefaultSharedPreferences后,它就可以正常工作了。我不能说:人们不要创建快捷方式,所以我必须更改代码。


2
一些设备随机丢失SharedPreferences数据并不罕见。请参见http://code.google.com/p/android/issues/detail?id=14359以获取示例。 - Graham Borland
这些信息只与getDefaultSharedPreferences有关吗?您是否了解getSharedPreferences(“myAppPrefs”,Context.MODE_PRIVATE)存在相同的问题? - Kostadin
尝试使用getSharedPreferences而不是默认的那个。它可以正常工作。 - png
在 getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 中,提示警告并标记为已弃用!现在我们该怎么办? - Dr.jacky
嗯...看起来操作系统版本会影响包名。请参阅我的问答,了解shared-prefs这些函数的区别:https://dev59.com/05jga4cB1Zd3GeqPHTw3#37953072 - Hack06
2个回答

65

试试这种方法:

final String eulaKey = "mykey";
Context mContext = getApplicationContext();
mPrefs = mContext.getSharedPreferences("myAppPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = mPrefs.edit();
editor.putBoolean(eulaKey, true);
editor.commit();

在这种情况下,您可以指定自己的偏好设置文件名(myAppPrefs)并控制对其的访问权限。其他操作模式包括:

  • MODE_WORLD_READABLE(世界可读)
  • MODE_WORLD_WRITEABLE(世界可写)
  • MODE_MULTI_PROCESS(多进程模式)

3
从快捷方式启动应用程序和从菜单启动应用程序会产生不同的DefaultSharedPreferences。在我从代码中移除了DefaultSharedPreferences后,它可以完美地工作。我不能只说:人们不使用快捷方式,所以我不得不改变代码。 - Kostadin

6
如果你已经升级到针对API 30的目标,请在Gradle依赖项中添加以下内容:
```implementation 'androidx.preference:preference-ktx:1.0.0'//适用于Kotlin项目```
这将为你的应用程序添加一个偏好设置库。
implementation 'androidx.preference:preference:1.1.1'//For Java Projects

在重新同步Gradle之后,将所有导入的内容更改为:

import android.preference.PreferenceManager

To

import androidx.preference.PreferenceManager

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接