我在应用程序中使用了联系人观察器来观察联系人的变化,并且在使用whatsapp时它会不断调用onchange方法,有没有办法避免这些额外的调用?(我已经覆盖了deliverySelfNotifications())
答案 0 :(得分:0)
调用您的onChange
方法是因为联系人数据实际上已更改,这是预期的行为。
在Whatsapp(以及许多其他应用程序)中发送消息时,联系人的TIMES_CONTACTED
和LAST_TIME_CONTACTED
值会更新,从而触发向所有观察者发出onChange通知。
ContentObserver不支持指定要触发的更改类型,而不会触发的更改,因此您的应用会要求所有类型的更改。
您需要保留一些本地副本(最好是简单的哈希值),该副本仅表示联系人数据中的有趣字段,然后,在调用onChange
方法时,查询最近修改过的联系人(使用CONTACT_LAST_UPDATED_TIMESTAMP),然后将以前的哈希值与新的哈希值进行比较(如果不同,则您知道联系人已更改。
这是您可以使用的示例查询:
private void fetchRecentContacts(long lastTimeChecked) {
String[] projection = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.CONTACT_LAST_UPDATED_TIMESTAMP }; // add more relevant fields here
String selection = Contacts.CONTACT_LAST_UPDATED_TIMESTAMP + " > " + lastTimeChecked;
Cursor cur = getContentResolver().query(Contacts.CONTENT_URI, projection, selection, null, null);
DatabaseUtils.dumpCursor(cur);
// iterate cursor and check for changes
cur.close();
}