Android - 为什么ContentObserver会调用自己?

时间:2010-10-24 18:51:51

标签: android sms observer-pattern

我正在尝试使用contentResolver.delete在ContentObserver中删除收到的SMS(在“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;
  }

1 个答案:

答案 0 :(得分:1)

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

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

deliverSelfNotification没有做你想象的那样:

  

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