El observador SMS enviado se ejecuta 3 veces

He definido el siguiente servicio con un observador de los mensajes enviados. El problema es que al enviar un mensaje, siento que se llama 3 veces el método onChange de contentobserver. ¿Alguien sabe decirme por qué?

Gracias

public class DSMSService extends Service { private static final String CONTENT_SMS = "content://sms"; private class MyContentObserver extends ContentObserver { ContentValues values = new ContentValues(); int threadId; public MyContentObserver() { super(null); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Log.v(TAG, "****************************** SMS change detected *************************************"); Log.v(TAG, "Notification on SMS observer"); // save the message to the SD card here Uri uriSMSURI = Uri.parse("content://sms"); Cursor cur = getBaseContext().getContentResolver().query(uriSMSURI, null, null, null, null); // this will make it point to the first record, which is the last SMS sent cur.moveToNext(); String content = cur.getString(cur.getColumnIndex("body")); Log.v(TAG, "content: " + content); } @Override public boolean deliverSelfNotifications() { return false; } } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { Log.v(TAG, "starting........"); MyContentObserver contentObserver = new MyContentObserver(); ContentResolver contentResolver = getBaseContext().getContentResolver(); contentResolver.registerContentObserver(Uri.parse("content://sms"),true, contentObserver); DAO = new DAOaBlackList(getBaseContext()); } @Override public void onDestroy() { Log.d(TAG, "stopping........"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.v(TAG, "Received start id " + startId + ": " + intent); // We want this service to continue running until it is explicitly // stopped, so return sticky. return START_STICKY; } @Override public void onStart(Intent intent, int startid) { Log.v(TAG, "onStart........"); } } 

Lo que quieres hacer es comprobar el _id del último elemento en el content://sms/sent send uri inside onChange. Debes almacenar el _id anterior (quizás en una variable global estática) y compararlo con el _id del último elemento ( cursor.moveToLast() ) del cursor después de consultar el content://sms/sent . Si el _id es el mismo, puede optar por ignorar la llamada a onChange. Estas múltiples llamadas a onChange creo que se debe a que los sms se están moviendo de carpeta a carpeta durante el envío – caja de salida, elementos enviados, alguna otra "carpeta invisible" (que no podemos saber exactamente qué, ya que esta característica REALMENTE REALMENTE necesita documentación). Como no puedes escuchar un Uri más específico que el content://sms/sent tendrás que implementar esta comprobación para _id cada vez que quieras detectar un sms que está siendo enviado.

Si el _id anterior es diferente al de su variable global estática, entonces usted tiene un sms que está siendo enviado.

Ha mantenido el observador para la base de datos de SMS a través de URI. Por lo que siempre que se envía el mensaje se actualiza la base de datos y se está actualizando 3 de la columna de esa tabla. Por lo que notificará al observador para cada uno de ellos. Por lo que se está solicitando tantas veces como los datos de la tabla se actualizan.

  • ¿Cómo construir una aplicación de Android que avisa al usuario, incluso si es asesinado?
  • Transmitir datos de la clase BroadcastReceiver a una actividad de Android
  • Android: detecta SMS saliente, cuenta incorrecta
  • Android: comparte texto sin formato con la intención (para todas las aplicaciones de mensajería)
  • Enviar SMS a través de ADB al teléfono
  • Receptor de radiodifusión dentro de un servicio
  • Cómo obtener lista de sms como convesations en cada dispositivo Android 2.2+
  • Interceptar mensajes entrantes de flash en Android Mobile
  • ¿Cómo evitar que los SMS entrantes lleguen a la bandeja de entrada?
  • Mover un mensaje a la bandeja de entrada desde la base de datos
  • Eliminar sms android después de recibir Sin demora
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.