ContentObserver和之间有什么区别DatasetObserver?
什么时候应该使用?
我Cursor用单排.我希望收到有关数据更改的通知 - 例如.当行更新时.
我应该注册哪个观察员班?
我能够得到一个通用通知"联系人数据库发生了变化",但我想知道插入,更新或删除的特定记录.以下是注册并获取onChange通知的代码.不幸的是,它并不具体,这使得我的处理功能详尽且效率低下.
这是代码存根:
if ((mNativeContactsObserver == null) && (mHandler == null)) {
mHandler = new Handler(this.getMainLooper()) {
};
mNativeContactsObserver = new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Bundle data = null;
Message message = mHandler.obtainMessage();
if (message != null) {
data = message.getData();
if (data != null) {
Logs.d(TAG, "Message = [" + message.toString() + "] data=[" + data.toString() + "]");
Logs.d(TAG, "Contents = [" + message.describeContents() + "]");
}
}
if (!selfChange) {
final Account accountListen = …Run Code Online (Sandbox Code Playgroud) 有很多与之相关的问题,但没有一个能帮助我找到解决方案.
我正在尝试将所有联系人从设备同步到远程服务器,并且能够轻松完成,但是当更新/删除/插入(新联系人)等联系人发生更改时无法找到解决方案.
尝试使用ContentObserver但onChange()被多次调用.很难找到联系人更改数据.
public class ContactService extends Service {
private int mContactCount;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mContactCount = getContactCount();
Log.d("Contact Service", mContactCount + "");
this.getContentResolver().registerContentObserver(
ContactsContract.Contacts.CONTENT_URI, true, mObserver);
}
private int getContactCount() {
Cursor cursor = null;
try {
cursor = getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI, null, null, null,
null);
if (cursor != null) {
return cursor.getCount();
} else {
return 0;
}
} catch (Exception ignore) { …Run Code Online (Sandbox Code Playgroud) 一个有希望直截了当的问题:当ContentResolver.notifyChange()为某个给定URI调用时,是否会ContentObserver观察到此URI的后代 URI?
例如,假设我有一个游标设置来观察特定资源的URI:
Uri uriA = Uri.parse("content://" + AUTHORITY + "/orders/21");
cursor.setNotificationUri(getContext().getContentResolver(), uriA);
Run Code Online (Sandbox Code Playgroud)
然后我通知ContentResolver更改此URI的祖先(例如,因为我删除了所有订单):
Uri uriB = Uri.parse("content://" + AUTHORITY + "/orders");
getContext().getContentResolver().notifyChange(uriB, null);
Run Code Online (Sandbox Code Playgroud)
我的Cursor注册观察uriA会被通知吗?
android uri android-contentresolver android-contentprovider contentobserver
我有以下ContentObserver接收和编写SMS的实现,但它被多次调用.
码:
public class SMSObserverActivity extends Activity {
protected MyContentObserver observer = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String url = "content://mms-sms/";
Uri uri = Uri.parse(url);
observer = new MyContentObserver(new Handler());
getContentResolver().registerContentObserver(uri, true, observer);
}
@Override
protected void onDestroy(){
super.onDestroy();
getContentResolver().unregisterContentObserver(observer);
}
class MyContentObserver extends ContentObserver {
ContentValues values = new ContentValues();
Handler handler;
public MyContentObserver(Handler handler){
super(handler);
this.handler = handler;
}
@Override
public boolean deliverSelfNotifications(){
return …Run Code Online (Sandbox Code Playgroud) 只是尝试确定在使用registerContentObserver或其他方法时是否有一种简单的方法来确定哪些联系人发生了变化?我可以告诉数据库何时更改,但不确定每次更新/更改发生时我都要检查所有记录.
基本上,如果我有一个联系人列表,一个通过手动方法更新(即我更改联系人的电话号码或添加新的联系人),或自动(说ActiveSync照片添加,更改).我希望能够A)知道某些事情发生了变化,并且B)知道哪些联系人的某些数据发生了变化.
我正在尝试寻找某些用户,我可以从远程服务中匹配他们的照片.如果有更多信息添加到用户帐户,我希望能够检查它以查看它是否提供匹配.我不想安排它,我想在更新发生后这样做.
克里斯.
我正在开发一个Android应用程序,我必须检测Android SD卡中音频文件的变化,文件名,文件路径和执行的操作.例如,如果我在SD卡中添加文件,那么我想知道
以前我已经尝试过文件观察器但是为此我必须在每个目录上应用它.所以我搜索了一些其他解决方案,并获得了有关Audio.Media.EXTERNAL_CONTENT_URI的信息.然后我创建了一个像这样的内容观察者
UriObserver.java - 一个内容观察者
class UriObserver extends ContentObserver {
public UriObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
super.onChange(selfChange);
Log.d("INSTANT", "GETTING CHANGES");
}
}
Run Code Online (Sandbox Code Playgroud)
这是注册的代码
UriObserver observer = new UriObserver(new Handler());
Log.d("INSTANT", "registered content observer");
this.getApplicationContext()
.getContentResolver()
.registerContentObserver(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false,
observer);
Log.d("INSTANT", "registered content observer");
Run Code Online (Sandbox Code Playgroud)
它让我知道在与音频文件相关的SD卡中发生了一些变化.但它没有提供有关添加,编辑或删除哪个文件的任何信息.
然后我搜索了解决方案并得到了这篇文章
Android:如何通过MTP连接时检测MediaStore中的更改
在这篇文章中,Bhiefer给出了一些代码作为答案,我认为它可以起作用,所以我试图实现它,但我无法这样做.
我能为此做些什么?
我可以查询Audio.Media.EXTERNAL_CONTENT_URI的最新更改吗?这段代码:
mCursor = context.getContentResolver().query(
Audio.Media.EXTERNAL_CONTENT_URI, …Run Code Online (Sandbox Code Playgroud) android android-sdcard android-mediascanner contentobserver fileobserver
如果联系人数据库中有任何更改(添加,删除),我想在手机上收到通知.现在我正在使用ContentObserver获得通知.以下是我的代码.问题是我无法知道哪个联系人改变了.任何人都可以帮忙???
public class ContentObserverActivity extends Activity {
Button registerbutton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
registerbutton=(Button)findViewById(R.id.button1);
registerbutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getContentResolver()
.registerContentObserver(
ContactsContract.Contacts.CONTENT_URI, true,
new MyCOntentObserver());
}
});
}
public class MyCOntentObserver extends ContentObserver{
public MyCOntentObserver() {
super(null);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.e("","~~~~~~"+selfChange);
}
@Override
public boolean deliverSelfNotifications() {
return true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
由于我的应用程序使用来自android.provider.ContactsContract.Data(API> 11)和ContactsContract.Contacts.CONTENT_URI(API <11)的内容来填充Contacts.
我试图registerContentObserver()反对这些提供商.但ContentObserver即使我在拨打电话时试图通过设备呼叫某个人,它也会调用我的电话.它确实会触发我ContentObserver对我没用的内容,因为没有内容更改Contacts Provider.
根本原因:
当从合法唤醒的设备发出呼叫时,似乎LAST_TIME_CONTACTED或某些事情ContactsContract.Contacts.CONTENT_URI会发生变化ContentObserver.
尝试:
private class ContactsContentObserver extends ContentObserver {
public ContactsContentObserver() {
super(null);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Zname.getPreferences().setRefreshContact(true);
}
}
Run Code Online (Sandbox Code Playgroud)
注册ContentObserver中OnCreate()的Activity
ContactsContentObserver contactsContentObserver = new ContactsContentObserver();
getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, false, contactsContentObserver);
Run Code Online (Sandbox Code Playgroud)
试着用notifyForDescendents为false上registerContentObserver.它仍会触发ContentObserver
QUES:
当且仅当联系人信息在CRUD(创建,更新,删除)或其后代之外时,如何注册ContentObserver哪个触发?Last_Time_Contacted
随着ListView我们有一个很好的本土模式的一些数据从数据库到列表图:
DB- > ContentProvider- > CursorLoader- > CursorAdapter- >ListView
这种方法在数据层分离,性能和自动数据更新方面表现良好.但这种模式并不适合新的RecyclerView.有一些模仿旧行为的方法:
但有使用旧式的问题notifyDataSetChanged有RecyclerView.它不能使用ItemAnimator功能,它会失去滚动位置,而且它只是无效.
那么,在使用数据库封装时,我们如何从优质变更通知中受益ContentProvider?Cursor是静态的,要从中获取新数据,我们需要获得新的数据Cursor.因此,似乎我们需要一个自定义中间数据层,它将合并来自Cursors的数据并将List实体暴露给RecyclerView.Adapter.此外,我们还必须手动将ContentObserver onChange()事件映射到RecyclerView通知.这也意味着我们必须摆脱CursorLoader.对于这样的基本任务来说,这是一项令人难以置信的工作.
有没有更好的解决方案?
android android-contentprovider contentobserver android-recyclerview