android:在whatsapp上聊天时调用内容观察器onchange方法

时间:2019-02-02 11:00:03

标签: android

我在应用程序中使用了联系人观察器来观察联系人的变化,并且在使用whatsapp时它会不断调用onchange方法,有没有办法避免这些额外的调用?(我已经覆盖了deliverySelfNotifications())

1 个答案:

答案 0 :(得分:0)

调用您的onChange方法是因为联系人数据实际上已更改,这是预期的行为。

在Whatsapp(以及许多其他应用程序)中发送消息时,联系人的TIMES_CONTACTEDLAST_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();
}