android - BroadcastReceiver 中的 SharedPreferences 似乎没有更新?

标签 android broadcastreceiver sharedpreferences alarmmanager

我有一个更新 SharedPreferences 中的字符串的 Activity 。

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = settings.edit();
editor.putString("username", username);
editor.commit();

然后我启动一个服务:

startService(new Intent(this, MyService.class));

该服务创建对扩展 BroadcastReceiver 的 Alarm 的引用:

Alarm alarm = null;
public void onCreate() {
    alarm = new Alarm();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    alarm.SetAlarm(this);
}

在 SetAlarm 中,我进行了所有基本设置(此时,“用户名”仍然正确.. 我检查过):

public void SetAlarm(Context context) {
    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 1000 * 60 * interval, pi);
}

然后我停止该服务,然后再次启动它(使用 SetAlarm)。

public void CancelAlarm(Context context) {
   Intent intent = new Intent(context, Alarm.class);
   PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
   AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
   alarmManager.cancel(sender);
}

问题出在 onReceive.. 第一次“用户名”字段是正确的。第二次,如果用户名在服务停止和启动之间更新,但是,它返回第一个值。该值似乎没有得到更新...

public void onReceive(Context context, Intent intent) {   
    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
    Log.e("hi", settings.getString("username", ""));
}

最佳答案

我遇到了同样的问题,经过几个小时的努力解决后,我终于找到了导致它的问题。在您的 AndroidManifest 中,您可能有类似的内容:

<receiver android:name="AlarmReceiver" android:process=":remote" />

最后一个属性 (process:remote) 导致接收器在调用时在不同的/新进程上运行。但是不同进程之间不支持 SharedPreferences。

所以我所做的是从 list 中删除最后一个属性。这意味着代码现在将在主线程上运行——但如果您只有几行代码来显示通知,那么这应该不是问题。另一种方法是调用服务来运行长操作。

关于android - BroadcastReceiver 中的 SharedPreferences 似乎没有更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10098981/

相关文章:

android - 当蓝牙断开连接或重新连接时,我的 webview 会重新加载

android - 在这种情况下,用户可以清除共享首选项但不能清除数据库

java - 未使用 TextButton 调用 Libgdx InputListener "exit()"

Android 重复每日闹钟不正确重复

android - 将语音转换为发音的最佳方式

android - 从 BroadcastReceiver 更新适配器

java - SharedPreferences 未按预期工作,无法读取或写入首选项

java - 我们可以使用 SharedPreference 将数据从一个 Activity 共享或传输到另一个 Activity 吗?

Android:保护您的私钥

android - 谷歌云测试实验室中的设备不兼容