3

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 参数为空:

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

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

4

2 回答 2

3

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

当您的内容提供者使用 通知注册的观察者getContext().getContentResolver().notifyChange(URI, "your_uri");时,它会要求ContentResponder它。该方法的返回值是ContentObserver您在内容响应者的方法中注册的值registerContentObserver(),这是您在第一种情况下所做的。但是,在第二种情况下,您Cursor使用 的registerContentObserver()方法注册了观察者Cursor,所以ContentResponder不知道。

于 2016-01-08T10:49:46.733 回答
2

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

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

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

于 2013-10-01T08:51:21.830 回答