11

我使用 SharedPreferences 在我的应用程序的不同活动中写入和稍后读取值。它过去可以正常工作,但最近它似乎没有被sincronized。我的意思是,我写了一个值,但其他活动仍然读取旧值。有时它可以正常工作。任何的想法?

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

首先,从一个线程:

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

问题来了,因为“值”不是线程中写入的值。

4

4 回答 4

6

这是我遇到的以及我为解决它所做的事情。

我正在从 Activity 触发警报,并且在该警报的 Broadcast-Receiver 中,我正在更新每次启动应用程序时都会读取的 Shared-Preferences。

触发警报后,无论何时启动应用程序,它都会获取仅从该活动设置的旧值。没有反映广播接收器的更改。

这里的技巧是将 Shared-Preferences 设置为MODE_MULTI_PROCESS

一般我们使用 MODE_PRIVATE,但做如下:

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

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

编辑:MODE_MULTI_PROCESS 需要最小 API 11

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

于 2014-04-14T06:22:18.993 回答
3
  1. SharedPreferences 被记录为不能跨进程工作, http: //developer.android.com/reference/android/content/SharedPreferences.html,“注意:目前这个类不支持跨多个进程使用。这将在以后添加。”

  2. 此答案建议将数据封装到内容提供程序中,并且讨论还考虑了一些其他选项,包括共享 SQLite:https ://stackoverflow.com/a/5265556/1665128

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

于 2013-01-02T21:22:24.863 回答
0

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

于 2013-01-02T22:55:54.413 回答
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);
于 2014-08-10T08:11:52.407 回答