es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se obtiene el valor actualizado de SharedPreferences.

Mi aplicación de flutter está escuchando los SMS tanto en primer plano como en segundo plano utilizando el paquete telephony. Mientras me registro para recibir los mensajes, he utilizado dos métodos (uno para primer plano y otro para segundo plano, como lo requiere el paquete telephony) de esta manera:

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

Pero dentro de ambos métodos tengo una llamada a un método común que guarda el SMS más reciente recibido en las preferencias compartidas, de esta manera:

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??”);
}

En la interfaz de la aplicación, obtengo lastsmsbody de la siguiente manera:

SharedPreferences sp = await SharedPreferences.getInstance();
String body = sp.getString(“lastsmsbody”)??”;

Muestro este valor en la interfaz de usuario. Esto funciona bien cuando la aplicación se ejecuta en primer plano. Los datos en la pantalla se actualizan cuando llegan los mensajes.

El problema es cuando la aplicación se envía al segundo plano. Desde los registros, veo que sigue recibiendo el mensaje y aún lo guarda en las preferencias. Pero cuando vuelvo a poner la aplicación en primer plano, no puede obtener el mensaje más reciente que se guardó cuando la aplicación estaba en segundo plano. sp.getString(“lastsmsbody”) obtiene el mensaje antiguo que se guardó cuando la aplicación estaba en primer plano.

Pensé que tal vez las preferencias son diferentes cuando la aplicación está en primer plano y en segundo plano. Pero si cierro la aplicación y la reinicio, sp.getString(“lastsmsbody”) devuelve el mensaje más reciente correctamente, el que se guardó cuando la aplicación estaba en segundo plano.

¿Alguien puede decirme qué está sucediendo aquí?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Explicación del problema

    El problema con el código es que cuando la aplicación pasa al segundo plano, el objeto SharedPreferences se vuelve nulo y no se puede acceder a él para recuperar o almacenar datos. Esto se debe a que SharedPreferences están asociados con el contexto activo actual de la aplicación, que cambia cuando la aplicación se envía al segundo plano.

    Cuando la aplicación está en primer plano, se puede acceder al objeto SharedPreferences y se puede recuperar el último mensaje de SMS utilizando sp.getString("lastsmsbody"), que devuelve correctamente el mensaje más reciente que se guardó cuando la aplicación estaba en primer plano.

    Sin embargo, cuando la aplicación se envía al segundo plano, el objeto SharedPreferences se vuelve nulo, por lo que cuando se vuelve a llevar la aplicación al primer plano, sp.getString("lastsmsbody") devuelve el mensaje antiguo que se guardó cuando la aplicación estaba en primer plano.

    Solución

    Para solucionar este problema, es necesario persistir los datos incluso cuando la aplicación no está en primer plano. Una forma de hacerlo es utilizar una base de datos para almacenar el mensaje de SMS más reciente. Otra opción es utilizar un servicio para manejar los mensajes de SMS entrantes y persistir los datos en un archivo, una base de datos SQLite o en Firebase Realtime Database.

    El uso de un servicio para manejar los mensajes de SMS entrantes asegura que los mensajes se persistan incluso cuando la aplicación está en segundo plano o no se está ejecutando. Cuando se vuelve a llevar la aplicación al primer plano, puede obtener el último mensaje de SMS desde el almacenamiento persistente y actualizar la interfaz de usuario.

    También puedes considerar utilizar SharedPreferences para almacenar la marca de tiempo del último mensaje de SMS, de modo que cuando se vuelva a llevar la aplicación al primer plano, se pueda consultar la hora del mensaje más reciente y recuperar el último mensaje desde el almacenamiento persistente.

    Al utilizar un método de almacenamiento persistente como un servicio o una base de datos, la aplicación puede persistir los datos incluso cuando está en segundo plano y recuperar los datos más recientes cuando se vuelve a llevar al primer plano.

    Por lo tanto, para solucionar el problema de no poder obtener el mensaje de SMS más reciente guardado en SharedPreferences cuando se vuelve a llevar la aplicación al primer plano, es necesario utilizar un método de almacenamiento persistente como un servicio o una base de datos para almacenar el mensaje de SMS más reciente.

Comments are closed.