Android的ContentObserver类的onChange()方法说:“包含已更改的内容Uri(如果可用)。”在什么情况下URI可用?在什么情况下它不可用?
uri参数是在API级别16(Android 4.1)中添加的,所以我希望它能够在Android 4.1及更高版本中设置。但是我在Android 4.3上看到一个没有设置uri的案例。
调用MyContentObserver.onChange()并传递有效的uri:
contentResolver.registerContentObserver(myUri, true, new MyContentObserver());
调用MyContentObserver.onChange()但uri参数为null:
contentResolver.query();
cursor.registerContentObserver(new MyContentObserver);
这是预期的吗?这些中的一个优先于另一个吗?我使用“content://com.google.android.gm/me@example.com/labels”并使用我自己的自定义ContentProvider对此进行了测试。
答案 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()
并不了解它。