Android - почему ContentObserver вызывает себя? - PullRequest
3 голосов
/ 24 октября 2010

Я пытаюсь удалить полученные SMS-сообщения в ContentObserver (для метода "content: // sms /") onChange () с помощью contentResolver.delete, но после удаления ContentObserver вызывается еще раз.

Не могли бы вы объяснить, когда ContentObserver запускается сам, несмотря на то, что метод deliverySelfNotifications () возвращает false?

Я хотел бы зарегистрировать ContentObserver перед удалением смс и зарегистрироваться снова после этого, но это не элегантно.

Мой код:

  private class SmsMmsContentObserver extends ContentObserver {
    public SmsMmsContentObserver(Handler handler)
    {
      super(handler);
    }


    @Override public boolean deliverSelfNotifications() { 
        return false; 
        }


    @Override
    public void onChange(boolean selfChange) {
      super.onChange(selfChange);


      Uri uriSMSURI = Uri.parse("content://sms/");
      Cursor cur = getContentResolver().query(uriSMSURI, null, null,
                   null, null);
      if (cur.moveToNext())
      {     
        int threadIdIn = cur.getInt(cur.getColumnIndex("thread_id"));
           getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null);
      }


    }
  }

Методы регистрации наблюдателя в сервисах.

private void registerSmsMmsObserver()
  {
   if (observer == null)
   {
       observer = new SmsMmsContentObserver(new Handler());
       contentResolver = getContentResolver();
       contentResolver.registerContentObserver(uriSmsMms, true, observer);
   }
  }


  private void unregisterSmsMmsObserver() 
  {
   if (contentResolver != null) 
    contentResolver.unregisterContentObserver(observer);
   observer = null;
  }

1 Ответ

1 голос
/ 10 августа 2011

Если вы хотите удалить SMS, когда оно поступит в почтовый ящик, используйте приемник для упорядоченного вещания, который соответствует цели получения SMS, получите более высокий приоритет, чем обычный почтовый ящик, и отмените трансляцию.

Кроме того, удаление обязательно вызовет onChange для любого contentObserver, наблюдающего этот URI.

deliverySelfNotification не делает то, что вы думаете:

Возвращает true, если этот наблюдатель интересуется уведомлениями об изменениях, сделанных через курсор, с которым он зарегистрирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...