请进来看下我这样使用ContentObserver为什么观察不到db的变动

 我来答
岛肯胺
2016-11-21 · TA获得超过117个赞
知道答主
回答量:219
采纳率:0%
帮助的人:125万
展开全部
项目需求:1当联系人更新时,本地表可以获取到更新的通知2程序退出后,仍然可以更新搜了网上很多文章,发现可以使用ContentObserver这个类实现需求1,对于需求2,当然是用Service实现了。代码如下:[java]viewplaincopyprint?publicclassDBUpdateServiceextendsService{protectedstaticfinalintLOCALCONTACTS_SYNC=1;privatefinalstaticintELAPSE_TIME=5000;//FIXME:Shouldremindthis//time./**SetanobservertolistentheLocalContacts'change.AstheDBofcontact*wouldbechangeaftermakeacallorsendamessage.Weshouldlistenthe*LogDBtoo.Ifitchange,webelievethecontactisnotchanged.It'snot*thebestway,justisatemporarysolution,butitcanhandlemanycases.*/publicContentObservermObserver=newContentObserver(newHandler()){@OverridepublicvoidonChange(booleanselfChange){super.onChange(selfChange);Log.i(TAG,"ContactonChange");mHandler.removeMessages(LOCALCONTACTS_SYNC);Log.v(TAG,"removeMessagesfinish.");mHandler.sendEmptyMessageDelayed(LOCALCONTACTS_SYNC,ELAPSE_TIME);}};protectedHandlermHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){super.handleMessage(msg);Log.v(TAG,"++++handleMessage"+msg);switch(msg.what){caseLOCALCONTACTS_SYNC://dowhatyouwanttodobreak;default:break;}}};@OverridepublicvoidonCreate(){super.onCreate();getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI,true,mObserver);---------注册ContentObserver}@OverridepublicintonStartCommand(Intentintent,intflags,intstartId){returnSTART_STICKY;---------------这个可以使Service在需要运行时候自动运行,即使程序退出了}@OverridepublicvoidonDestroy(){getContentResolver().unregisterContentObserver(mObserver);-----------------------------------------------注销ContentObserver}}publicclassDBUpdateServiceextendsService{protectedstaticfinalintLOCALCONTACTS_SYNC=1;privatefinalstaticintELAPSE_TIME=5000;//FIXME:Shouldremindthis//time./**SetanobservertolistentheLocalContacts'change.AstheDBofcontact*wouldbechangeaftermakeacallorsendamessage.Weshouldlistenthe*LogDBtoo.Ifitchange,webelievethecontactisnotchanged.It'snot*thebestway,justisatemporarysolution,butitcanhandlemanycases.*/publicContentObservermObserver=newContentObserver(newHandler()){@OverridepublicvoidonChange(booleanselfChange){super.onChange(selfChange);Log.i(TAG,"ContactonChange");mHandler.removeMessages(LOCALCONTACTS_SYNC);Log.v(TAG,"removeMessagesfinish.");mHandler.sendEmptyMessageDelayed(LOCALCONTACTS_SYNC,ELAPSE_TIME);}};protectedHandlermHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){super.handleMessage(msg);Log.v(TAG,"++++handleMessage"+msg);switch(msg.what){caseLOCALCONTACTS_SYNC://dowhatyouwanttodobreak;default:break;}}};@OverridepublicvoidonCreate(){super.onCreate();getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI,true,mObserver);---------注册ContentObserver}@OverridepublicintonStartCommand(Intentintent,intflags,intstartId){returnSTART_STICKY;---------------这个可以使Service在需要运行时候自动运行,即使程序退出了}@OverridepublicvoidonDestroy(){getContentResolver().unregisterContentObserver(mObserver);-----------------------------------------------注销ContentObserver}}参考:/questions/10431881/how-to-know-the-contact-is-updated-in-android/10432259#104322596985171更新:对于问题2,只需要注册了contentobserver就可以实现了,因为系统有一个ContentService会管理注册的observer。如果有数据修改,系统会自动向注册的observer发送通知。代码中需要实现两个onChange
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式