SharedPreferences读取旧值

时间:2013-01-02 19:38:32

标签: android sharedpreferences

我使用SharedPreferences编写并稍后在我的应用程序中的不同活动中读取值。 它曾经工作正常,但最近它似乎没有被混合。我的意思是,我写了一个值但是其他活动仍然读取旧值。 有时它会正常工作。 有什么想法吗?

编辑: 这是一个示例代码:

首先,来自一个主题:

SharedPreferences prefs = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("ComandToDo", value);
editor.commit();
... some code later:
alarmmanager.set(AlarmManager.RTC_WAKEUP, Miliseconds, sender);

在闹钟接收器中:

SharedPreferences prefs = contexto.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
int value = prefs.getInt("ComandToDo", -1);    

这就是问题,因为“value”不是线程中写的值。

4 个答案:

答案 0 :(得分:5)

以下是我遇到的以及我采取的措施。

我正在触发来自活动和广播接收器的警报,我正在更新每次启动应用时读取的共享偏好设置。

触发警报后,每当应用程序启动时,它都会获得仅从该活动设置的旧值。没有反映出Broadcast-Receiver的变化。

这里的诀窍是将共享首选项设置为 MODE_MULTI_PROCESS

通常我们使用MODE_PRIVATE,但执行如下操作:

SharedPreferences prefs = this.getSharedPreferences("Preferences", MODE_MULTI_PROCESS);

注意:在代码中更改模式后,建议清除应用程序数据以避免在调试时出现问题。

编辑: MODE_MULTI_PROCESS需要min API 11

在API 11之前,我能想到的解决方法是创建一个包含两列KEY&的数据库。值。 这可以从其他模块访问。

答案 1 :(得分:3)

  1. 记录SharedPreferences不能跨进程工作http://developer.android.com/reference/android/content/SharedPreferences.html,"注意:目前此类不支持跨多个进程使用。这将在稍后添加。"

  2. 本回答建议将数据封装到内容提供商中,讨论还会考虑其他一些选项,包括共享的SQLite:https://stackoverflow.com/a/5265556/1665128

  3. 文件系统中也有普通的旧文件。我们在几个项目中使用它们,锁定,没有任何问题。也可能是你的选择。

答案 2 :(得分:0)

您正在写入“MyPrefs”首选项文件,然后尝试从“PerfilDeSonidoPreferencias”文件中读取。请从同一个偏好文件中读/写。

答案 3 :(得分:0)

只需使用 IntentService 代替BroadcastReceiver。它对我有用。

服务类:

public class ServiceClass extends IntentService {

    public NotificationPopupService(String name) {
        super(name);
    }

    public NotificationPopupService(){
        super("YOU_DEFAULT_NAME");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

        do magic...
    }
}

在应用程序标记中的AndroidManifest.xml文件中:

<service android:name="ServiceClass"/>

创建闹钟:

intent = new Intent(context, ServiceClass.class);
pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// magic after 2 seconds after the creation of alarm
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 2000, pendingIntent);