安卓 - 为什么ContentObserver会自行触发?

3

我正在尝试使用contentResolver.delete在ContentObserver("content://sms/")onChange()方法中删除接收到的短信,但是在删除后,ContentObserver会再次被调用。

你能解释一下吗?为什么ContentObserver会调用自身,即使deliverSelfNotifications()返回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
如果您想在短信到达收件箱时将其删除,请使用与SMS接收意图匹配的有序广播接收器,比常规收件箱具有更高的优先级,并取消广播。
此外,删除肯定会在观察此URI的任何contentObserver上调用onChange。
deliverSelfNotification并不像您认为的那样:
返回true,如果此观察者对通过观察者注册的游标进行的更改的通知感兴趣。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接