联系人ContentObserver随机调用

时间:2011-12-09 22:02:02

标签: android contacts contentobserver

我正在使用ContentObserver来监听联系人数据库中的更改。现在我意识到onChange()方法被随机调用,即使我没有对联系人做任何更改。我怀疑这与自动联系人同步有关(即使此时联系人没有真正的变化)。

是否有可能仅在用户做出的联系人有真正的变化时才收到通知?

thx simon

public class ContactsObserver extends ContentObserver {
private final static String TAG = ContactsObserver.class.getSimpleName();

private Context ctx;
private List<ContactsChangeListener> listeners = new ArrayList<ContactsChangeListener>();

private ContactsObserver(Context ctx) {
    super(new Handler());
    this.ctx = ctx.getApplicationContext();
    ctx.getContentResolver()
        .registerContentObserver(
                ContactsContract.Contacts.CONTENT_URI,  // uri
                false,                                  // notifyForDescendents
                this);                                  // observer
}

@Override
public void onChange(boolean selfChange) {
    Log.i(TAG, "Contacs change");
    for(ContactsChangeListener l : listeners){
        l.onContactsChange();
    }
}

@Override
public boolean deliverSelfNotifications() {
    return false; // set to true does not change anything...
}

public static ContactsObserver register(Context ctx){
    Log.d(TAG, "register");
    return new ContactsObserver(ctx);
}

public void unregister(){
    Log.d(TAG, "unregister");
    ctx.getContentResolver().unregisterContentObserver(this);
}

public void addContactsChangeListener(ContactsChangeListener l){
    listeners.add(l);
}

public interface ContactsChangeListener{
    void onContactsChange();
}
}

1 个答案:

答案 0 :(得分:1)

好的,既然似乎没有人对这个问题有答案,这就是我所做的:

创建观察者时,我将所有联系人加载到缓存中。然后,在每个onChange()事件中,我再次加载联系人并将它们与缓存的联系人进行比较,以查看是否存在差异。

不是最优雅的解决方案,但至少可以起作用......