在广播接收器SharedPreferences似乎没有更新?(SharedPreferences i

2019-06-23 12:50发布

我有更新的SharedPreferences字符串中的活动。

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

然后我启动服务:

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

服务营造到报警参考延伸广播接收器:

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", ""));
}

Answer 1:

我有同样的问题,并争取时间来解决这个问题之后,我终于发现了问题引起的。 在你AndroidManifest你可能有这样的事情:

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

最后一个属性(处理:远程)使接收机在被调用时在不同的/新的进程中运行。 但SharedPreferences是不是不同进程之间的支持。

所以我所做的就是从清单中删除这最后一个属性。 言下之意是,该代码将现在主要的线程上运行 - 但如果你只有几行显示一个通知,然后,不应该是一个问题。 另一种方法是调用一个服务运行的长时间操作。



Answer 2:

不幸的是阿米尔NAOR解决方案在我的Android应用程序7没有奏效。 似乎每个接收器获得一个新的进程开始工作。

API <23

所以,如果您的应用程序<API等级23,你可以使用标志Context.MODE_MULTI_PROCESS

context.getSharedPreferences("mypreferences", Context.MODE_PRIVATE | Context.MODE_MULTI_PROCESS);

API> = 23

什么惊喜。 由于API等级23是标志Context.MODE_MULTI_PROCESS 过时 ,我们应该使用ContentProvider的进程之间共享的属性。


目前在GitHub上一个非常好的库: 托盘-一个SharedPreferences更换为Android 。 这个库是一个ContentProvider包装与其他一些有用的功能。 试试看。



文章来源: SharedPreferences in BroadcastReceiver seems to not update?