【问题标题】:Android - why ContentObserver invokes itself?Android - 为什么 ContentObserver 会调用自己?
【发布时间】:2010-10-24 18:51:51
【问题描述】:

我正在尝试使用 contentResolver.delete 删除 ContentObserver(在“content://sms/”上)onChange() 方法中收到的短信,但在删除 ContentObserver 后又调用了一次。

您能否解释一下,尽管 DeliverSelfNotifications() 返回 false,但 ContentObserver 会调用自己吗?

我建议在删除短信之前注册 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;
  }

【问题讨论】:

    标签: android sms observer-pattern


    【解决方案1】:

    如果您想在短信到达收件箱时将其删除,请使用与短信接收意图匹配的有序广播接收器,获得比常规收件箱更高的优先级,然后取消广播。

    此外,删除肯定会在任何观察此 URI 的 contentObserver 上调用 onChange。

    deliverSelfNotification 并没有像你想象的那样做:

    如果此观察者对通过观察者注册的光标所做的更改的通知感兴趣,则返回 true。

    【讨论】:

      猜你喜欢
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2012-07-14
      • 2011-01-16
      相关资源
      最近更新 更多