uri在什么情况下传递给Android';s ContentObserver.onChange()回调?
Android的ContentObserver类的onChange()方法说,“在可用时包括更改的内容Uri。”Uri在什么情况下可用?在什么情况下不可用 uri参数是在API级别16(Android 4.1)中添加的,因此我希望在Android 4.1及更高版本中设置它。然而,我在安卓4.3上看到了一个未设置uri的案例 方法1:工程 调用MyContentObserver.onChange()并向其传递有效的uri:uri在什么情况下传递给Android';s ContentObserver.onChange()回调?,android,android-contentprovider,contentobserver,Android,Android Contentprovider,Contentobserver,Android的ContentObserver类的onChange()方法说,“在可用时包括更改的内容Uri。”Uri在什么情况下可用?在什么情况下不可用 uri参数是在API级别16(Android 4.1)中添加的,因此我希望在Android 4.1及更高版本中设置它。然而,我在安卓4.3上看到了一个未设置uri的案例 方法1:工程 调用MyContentObserver.onChange()并向其传递有效的uri: contentResolver.registerContentObserv
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。如果您在公共表(如people、mediaprovider等)上设置
ContentObserver
,则很遗憾,您可能不会收到任何Uri
作为参数,它可能为空,因为它取决于内容提供者实现。要在更改时接收有效的Uri
,必须修改相应的ContentProvider
以通知更改以及Uri
e、 ggetContext().getContentResolver().notifyChange(Uri,“您的Uri”)
//这将通知所有注册的ContentObserver
,其中包含修改后的相关数据集的Uri
如果您正在编写自己的
ContentProvider
,则在对数据库执行更新、删除或插入操作时,请使用上述行。这是一个老问题,但仍然没有回答。所以我会补充我的答案,以防人们仍然对此感到好奇
当您的内容提供商使用
getContext().getContentResolver().notifyChange(URI,“您的URI”)通知注册的观察者时
,它向内容响应程序
请求它。该方法的返回值是您在内容响应程序的registerContentObserver()
方法中注册的ContentObserver
,这就是您在第一种情况下所做的。但是,在第二种情况下,您使用游标
的registerContentObserver()
方法在游标
中注册了观察者,因此内容响应者
不知道它。知道为什么游标.registerContentObserver()总是给出空uri吗(即使ContentPRovider使用uri调用notifyChange())?这是预期的吗?@MarkDoliner在ContentObserver的文档中指出,带有uri参数的onChange()版本仅在API 16(Android 4.1)中存在这可能是你的问题。我想这可能不是我看到的具体问题的原因,因为我在使用4.3进行测试。我只是偶然发现了同样的东西,可能是一个bug。我使用了你的方法1。