自动更新 s 的惯用且正确的方法Cursor
是在创建它们时调用Cursor#setNotificationUri
,然后再将它们交给任何请求它们的对象。然后ContentResolver#notifyChange
在该Cursor
Uri 的命名空间中的任何内容发生更改时调用。
例如,假设您正在创建一个简单的邮件应用程序,并且您想在新邮件到达时进行更新,同时还提供邮件的各种视图。我会定义一些基本的 Uri。
content://org.example/all_mail
content://org.example/labels
content://org.example/messages
现在,假设我想要一个光标,它给我所有邮件并在新邮件到达时更新:
Cursor c;
//code to get data
c.setNotificationUri(getContentResolver(), Uri.parse("content://org.example/all_mail");
现在新邮件到了,所以我通知:
//Do stuff to store in database
getContentResolver().notifyChange(Uri.parse("content://org.example/all_mail", null);
我还应该通知Cursor
为这条新消息遇到的标签选择的所有 s
for(String label : message.getLabels() {
getContentResolver().notifyChange(Uri.parse("content://org.example/lables/" + label, null);
}
而且,也许一个光标正在查看一条特定的消息,所以也要通知他们:
getContentResolver().notifyChange(Uri.parse("content://org.example/messages/" + message.getMessageId(), null);
getContentResolver()
调用发生在访问数据的地方。因此,如果它在 aService
或ContentProvider
那是你setNotificationUri
和notifyChange
. 您不应该从访问数据的位置(例如Activity
.
AlarmProvider
是一个简单ContentProvider
的,使用这种方法来更新Cursor
s。