Контакты ContentObserver вызываются случайным образом

я использую ContentObserver для прослушивания изменений в базе данных контактов. теперь я понял, что метод onChange() вызывается случайным образом, даже если я не вносил никаких изменений в контакты. я подозреваю, что это как-то связано с автоматической синхронизацией контактов (хотя на данный момент реальных изменений в контактах нет).

есть ли возможность получать уведомления только в случае реальных изменений в контактах, сделанных пользователем?

спасибо Саймон

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();
}
}

person SimonSays    schedule 09.12.2011    source источник


Ответы (1)


хорошо, поскольку ни у кого, кажется, нет ответа на этот вопрос, вот что я сделал:

при создании обозревателя я загружаю все контакты в кеш. затем при каждом событии onChange() я снова загружаю контакты и сравниваю их с кэшированными, чтобы увидеть, есть ли разница или нет.

не самое элегантное решение, но, по крайней мере, оно работает...

person SimonSays    schedule 16.02.2012
comment
Саймон правильно говорит; более элегантный (и, возможно, хрупкий) метод описан в комментарии himanshu и его ответе по адресу mylifewithandroid.blogspot.com/2008/03/observing-content.html - person kellogs; 20.03.2012