0

我的颤振应用程序正在使用电话包在前台和后台收听短信。在注册接收消息时,我使用了两种方法(一种用于前台,一种用于后台,根据电话包的要求,如下所示:

telephony.listenIncomingSms(onNewMessage: onMessage, onBackgroundMessage: onBackgroundMessage);

但是在这两种方法内部都调用了一个通用方法,该方法将最近收到的 SMS 保存到共享首选项中,如下所示:

onMessage(SmsMessage message) async {
 ...
 saveLastMsg(message);
}
onBackgroundMessage(SmsMessage message) async {
 ...
 saveLastMsg(message);
}
saveLastMsg(SmsMessage message) async{
  SharedPreferences sp = await SharedPreferences.getInstance();
  sp.setString("lastsmsbody", message.body??'');
}

在 App UI 中,我像这样获取 lastsmsbody:

SharedPreferences sp = await SharedPreferences.getInstance();
String body = sp.getString("lastsmsbody")??'';

我在 UI 中显示这个值。当应用程序在前台运行时,这工作正常。屏幕上的数据会随着消息的出现而更新。

问题是当应用程序在后台推送时。从日志中,我看到它仍然收到消息,并且仍然将其保存在首选项中。但是当我将应用程序带回前台时,它无法获取应用程序在 bg 中时保存的最新消息。sp.getString("lastsmsbody") 获取应用程序在前台时保存的旧消息。

我认为当应用程序位于 fg 和 bg 时,偏好可能会有所不同。但是,如果我终止应用程序并重新启动,sp.getString("lastsmsbody") 会返回应用程序在 bg 中时保存的最新消息正确。

有人能告诉我这里发生了什么吗?

4

1 回答 1

1

您可能需要SharedPreferences.reload

final prefs = await SharedPreferences.getInstance();
await prefs.reload(); 
于 2021-12-22T06:59:56.190 回答