在什么情况下uri传递给Android的ContentObserver.onChange()回调?

时间:2013-09-24 20:49:17

标签: android android-contentprovider contentobserver

Android的ContentObserver类的onChange()方法说:“包含已更改的内容Uri(如果可用)。”在什么情况下URI可用?在什么情况下它不可用?

uri参数是在API级别16(Android 4.1)中添加的,所以我希望它能够在Android 4.1及更高版本中设置。但是我在Android 4.3上看到一个没有设置uri的案例。

方法1:工作

调用MyContentObserver.onChange()并传递有效的uri:

contentResolver.registerContentObserver(myUri, true, new MyContentObserver());

方法2:不起作用 - 为什么不呢?

调用MyContentObserver.onChange()但uri参数为null:

contentResolver.query();
cursor.registerContentObserver(new MyContentObserver);

这是预期的吗?这些中的一个优先于另一个吗?我使用“content://com.google.android.gm/me@example.com/labels”并使用我自己的自定义ContentProvider对此进行了测试。

2 个答案:

答案 0 :(得分:2)

如果您在公共表(例如人,mediaprovider等)上设置ContentObserver,那么很遗憾您可能不会收到任何Uri作为参数,它可能是空白的,因为它取决于内容提供程序实现。要在更改时收到有效的Uri,必须修改相应的ContentProvider以通知更改以及URI

例如getContext().getContentResolver().notifyChange(Uri, "your_uri"); //这会通知ContentObserver所有已修改的相关数据集的Uri

如果您正在编写自己的ContentProvider,那么每当您对数据库执行更新,删除或插入操作时,请使用上述行。

答案 1 :(得分:2)

这是一个老问题,但仍然没有答案。所以我会添加我的答案,以防人们仍然对此感到好奇。

当您的内容提供商使用getContext().getContentResolver().notifyChange(URI, "your_uri");通知注册观察者时,它会向ContentResponder询问。该方法的返回值是您使用内容响应程序的ContentObserver方法注册的registerContentObserver(),这是您在第一种情况下所做的操作。但是,在第二种情况下,您使用Cursor的{​​{1}}方法在[{1}}中注册了观察者,因此registerContentObserver()并不了解它。