我一直在关注 ICS 的框架,并且似乎 Android Contacts Provider 中的 ContactsProvider2 在任何插入/更新后调用 notifyChange,不仅如此,它还通过以下方式实现:
NotifyChange(ContactsContract.AUTHORITY_URI, null, syncToNetwork);
这意味着在联系人 AUTHORITY Uri 上的任何插入/更新/删除都会触发内容观察者获取更新。虽然从理论上讲,这非常好.. 似乎它也可以通过 Presence 更新触发。
如果我尝试在数据表上拉一个游标,它也会将数据表链接到存在,并且对存在的任何更新都有 onLoadFinished 被调用(CursorLoader)。
查看游标问题,看起来是因为 ContactsProvider2 调用
setTablesAndProjectionMapForData()
这又将 Presnce/status 列附加到每个数据行。
appendContactPresenceJoin(sb, projection, RawContacts.CONTACT_ID);
appendContactStatusUpdateJoin(sb, projection, ContactsColumns.LAST_STATUS_UPDATE_ID);
appendDataPresenceJoin(sb, projection, DataColumns.CONCRETE_ID);
appendDataStatusUpdateJoin(sb, projection, DataColumns.CONCRETE_ID);
有没有办法注册一个内容观察者来获取数据表的更新,而实际上却没有获取状态更改的更新?我相信存在曾经被排除在 2.3 / 3.x 中的 Data.CONTENT_URI 查询中。但看起来它已经改变了。