ContentObserver類詳解(Android中內(nèi)容觀察者的使用)_第1頁
ContentObserver類詳解(Android中內(nèi)容觀察者的使用)_第2頁
ContentObserver類詳解(Android中內(nèi)容觀察者的使用)_第3頁
ContentObserver類詳解(Android中內(nèi)容觀察者的使用)_第4頁
ContentObserver類詳解(Android中內(nèi)容觀察者的使用)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、http:/更多應(yīng)用詳解: http:/blog. csdn. net/qinjuning前言:工作中,需要開啟一個線程大量的查詢某個數(shù)據(jù)庫值發(fā)送了變化,導(dǎo)致的開銷很 大,后來在老大的指點下,利用了contentobserver完美的解決了該問題,感到很興奮,做完之后自己也對contentobserver 做下總結(jié)。contentobserver內(nèi)容觀察者,目的是觀察(捕捉)特定uri引起的數(shù)據(jù)庫的變化,繼而做一些相應(yīng)的處理,它類似于數(shù)據(jù)庫技術(shù)中的觸發(fā)器(trigger),當(dāng)contentobserver所觀察的uri發(fā)生變化時,便會觸發(fā)它。觸發(fā)器分為表觸發(fā)器、行觸發(fā)器,相應(yīng)地 content

2、observer 也分為“表 “contentobserver、“行” contentobserver,當(dāng) 然這是與它所監(jiān)聽的uri mime type有關(guān)的。熟悉content provided內(nèi)容提供荀的應(yīng)該知道,我們可以通過urimatcher類注冊不同類型的uri,我們可以通過這些不同的uri來查詢不同的結(jié)果。根據(jù)uri返回的結(jié)果,uri type可以分為:返回多條數(shù)據(jù)的 uri、返回單條數(shù)據(jù)的uri。注冊/取消注冊contentobserver方法,抽象類contentresolver類中的方法原型如下:public final void registercontentobserve

3、r(uri uri, boolean notifyfordescendents,conten tobserver observer)功能:為指定的uri注冊一個contentobserver派生類實例,當(dāng)給定的uri發(fā)生改變時,回調(diào)該實例對象去處理。參數(shù):uri 需要觀察的uri(需要在urimatcher里注冊,否則該uri也沒 有意義了)notifyfordescendents為false表示精確匹配,即只匹配該uri為true表示可以同時匹配其派生的uri,舉例如下:假設(shè)urimatcher里注冊的uri共有一下類型:1、content:/com.qin.cb/student (學(xué)生)2

4、、content:/com.qin.cb/student/#3、conten t:/com. qin .cb/stude nt/schoolchild(小學(xué)牛, 派生的uri)假設(shè)我們當(dāng)前需要觀察的uri為content:/com.qin.cb/student,如果 發(fā)生數(shù)據(jù)變化的uri為content:/com.qin.cb/student/schoolchild ,當(dāng) notifyfordescendents 為 false,那么該contentobserver會監(jiān)聽不到,但是當(dāng)notifyfordescendents為ture,能捕捉該uri的數(shù)據(jù)庫變化。observer content

5、observer 的派牛類實例public final void unregistercontentobserver(contentobserver observer) 功能:取消對給定uri的觀察參數(shù):observer contentobserver的派牛類實例contentobserver 類介紹構(gòu)造方法 public void contentobserver(handler handler)說明:所有comentobserver的派牛類都需要調(diào)用該構(gòu)造方法參數(shù):handler handler對象??梢允侵骶€程handler(這時候可以更新 ui 了),也可以是任何handler對象。常用

6、方法void onchange(boolean selfchange)功能:當(dāng)觀察到的uri發(fā)牛變化時,回調(diào)該方法去處理。所有contentobserver的 派生類都需要重載該方法去處理邏輯。參數(shù):selfchange回調(diào)后,其值一般為false,該參數(shù)意義不大(我也不懂,理解 方法最重要)。另外兩個方法,用處不大,我也不懂,大家參照sdk自行理解,冒昧了。boolean deliverselfnotifications() 說明:returns true if this observer is interested in notifications for changes made thr

7、ough the cursor the observer is registered with.final void dispatchchange(boolean selfchange)觀察特定uri的步驟如下:1、創(chuàng)建我們特定的contentobserver派生類,必須重載父類構(gòu)造方法,必須重載 onchange()方法去處理冋調(diào)后的功能實現(xiàn)2、利用 context.getcontentresolover()獲得 contentresolove 對象,接著調(diào)用 registercontentobserver()方法去注冊內(nèi)容觀察者3、由于contentobserver的生命周期不同步于act

8、ivity和service等,因此,在 不需要吋,需要手動的調(diào)用unregistercontentobserver()去取消注冊。好了,基本講解就介紹到這兒了。下面給出小demo的簡單說明:demo中共有兩個不同的contentobserver派生類,如下:1、用來觀察系統(tǒng)是否改變了飛行1模式狀態(tài),ps: 大家可以去 sdk 中查看該類:vider.settings.systemo 該類封 裝了對設(shè)置模塊下所有值的存取,比如:飛行模式狀態(tài)、藍牙狀態(tài)、屏幕亮度值等,并且提供了相應(yīng)的uri。2、觀察系統(tǒng)的短信息數(shù)據(jù)發(fā)生了變化。當(dāng)監(jiān)聽到短信數(shù)據(jù)發(fā)生變化時,查詢所有 已發(fā)送的短信

9、并且顯示岀來。短信的uri共有一下兒種:content:/sms/inbox 收件箱co n te nt :/s ms/sent己發(fā)送co n te n t :/s m s/d raft草稿(止在發(fā)送的信息)content:/sms/outbox 發(fā)件箱content:/sms/failed 發(fā)送失敗con tent:/sms/queued待發(fā)送列表(比如開啟飛行模式后,該短信就在待發(fā)送列表里) 關(guān)于短信的更多內(nèi)容可以參考該博客:vandroid中管理短信當(dāng)開啟飛行模式和發(fā)送短信后(注意:使用home鍵退出,而不是back鍵),dmeo 截圖如下:demo文件如下:1、觀察飛行模式狀態(tài)的 co

10、ntentobserver 派生類,airplanecontentobserver.javajava view plaincopyprint?1. package comqin.contentobserver;2.2. import android.content.context;3. import android.database.contentobserver;4. import .uri;5. import android.os.handler;6. import vider*;7. import vider.settings.settingn

11、otfoundexception;8. import android.util.log;10.11.12. /用來觀察system 里飛行模式所在行是否發(fā)生變化,“行”內(nèi)容觀察者13. public class airplanecontentobserver extends contentobserver 1415. private static string tag = "airplanecontentobserver” ;16.16. private static int msg_airplane = 1 ;18.17. private context mcontext;18.

12、private handler mhandler ;/此 handler 用來更新 ui 線程21.19. public airplanecontentobserver(context context, handler handler) 20. super(handler);24mcontext = context;25.mhandler = handler ;26 27.28/*29. *當(dāng)所監(jiān)聽的uri發(fā)生改變時,就會回調(diào)此方法30. *31. * paramselfchange此值意義不大一般情況下該回調(diào)值false32. */33. override34. public voidonc

13、hange(booleanselfchange) 35. log.i(tag, ,fthe airplane mode has changed");36.36. /系統(tǒng)是否處于飛行模式下37. try 38. int isairplaneopen 二 settings.system.getint(mcontext.getcontentresolver()settingssystemairplane_mode_on);40logi(tag, " isairplaneopen > " +isairplaneopen);41. mhandler.obtainmes

14、sage(msg_airplane,isairplaneopen)sendtotarget();42. 43. catch(settingnotfoundexception e) 44. / todo auto-generated catch block45. e.printstacktrace();46. 47.47. 49.48. 2觀察系統(tǒng)里短消息的數(shù)據(jù)庫變化的contentobserver派生類,smscontentobserver.javajava view plaincopyprint?1. package com.qin.contentobserver;23. import an

15、droid.content.context;4. import android.database.contentobserver;5. import android.database.cursor;6. import .uri;7. import android.os.handler;8. import android.util.log;9.10.11./用來觀察系統(tǒng)里短消息的數(shù)據(jù)庫變化”表“內(nèi)容觀察者,只要信息數(shù)據(jù)庫發(fā)生變化,都會觸發(fā)該contentobserver 派生類&8.29.30.

16、7.public class smscontentobserver extends contentobserver private static string tag = "smscontentobserver"private int msg_outboxcontent = 2 ;private context mcontext ;private handler mhandler ;/更新 ui 線程public smscontentobserver(context context,handler handler) super(hand

17、ler);mcontext 二 context ;mhandler = handler ;/*當(dāng)所監(jiān)聽的uri發(fā)生改變時,就會回調(diào)此方法* param selfchange 此值意義不大一般情況下該回調(diào)值false*/overridepublic void onchange(boolean selfchange)log.i(tag, hthe sms table has changed11);/查詢發(fā)件箱里的內(nèi)容uri outsmsuri = uri parse(ncontent: /sms/sent11);cursor c = mcontext.getcontentresolver().qu

18、erycoutsmsuri, null, null, null4"date desc");4.if(c != null)log.i(tag, "the number of send ish+c.getcount();stringbuilder sb = new stringbuilder();/循環(huán)遍歷while(cmovetonext()45 /sb append(11 發(fā)件人手機號碼:m+c getlnt(c getcolumnlndex("address")46 / append("信息內(nèi)容

19、:"+c.getlnt(c getcolumnindex("body11)47 / append("是否査看:"+c.getlnt(c.getcolumnindex(,lread")48 / append (”發(fā)送時間:h+c getlnt (c getcolumnindex( mdatem)49 /.append(”n“);50.sb.append("發(fā)件人手機號碼:"+c.getlnt(c.getcolumnindex(naddress")51 append("信息內(nèi)容:h+c getstring(c

20、.getcolumnlndexcody")52.append(,nh);5人54.c.close();55mhandlerobtainmessage(msg_outboxcontent,sbtostring()sendtotarget();56. 57. 5&593、主工程邏輯為mainactivity.java,對短消息的觀察uri,通過測試我發(fā)現(xiàn)只能監(jiān)聽此uri “content:/sms”(等同于mcontent:/sms/n),而不能監(jiān)聽其他的uri,比如” conten t:/sms/outbox”等。java view plaincopyprint?1. pack

21、age comqin.contentobserver;2.3 import android.app.activity;4. import android.database.cursor;5. import .uri;6. import android.os.bundle;7. import android.os.handler;8. import android.os.message;9. import vider.*;10 import androidutillog;11 import androidwidgetedittext;12 import androidwid

22、get.textview;13.14. public class mainactivity extends activity 15.15. private textview tvairplane;16. private edittext etsmsoutbox;18.19./ message 類型值20.21 8 private static final int msg_airplane = 1; private static final int msg_outboxcontent = 2;private airplanecontentobserver a

23、irplaneco; private smscontentobserver smscontentobserver;/* called when the activity is first created. */ overridepublic void oncreate(bundle savedinstancestate) super.oncreate(savedlnstancestate);2.43.44 45.46.47 0.61 62 63 6

24、4.65.66 67.68.69 70 71 72.73.74.setcontentview(rlayoutmain);tvairplane = (textview) findviewbyld(r.idtvairplane);etsmsoutbox = (edittext) findviewbyid(r.id.smsoutboxcontent);/創(chuàng)建兩個對象airplaneco = new airplanecontentobservercthis mhandler);smscontentobserver = new smscontentobservercthis mhandler);注冊內(nèi)容

25、觀察者registercontentobservers。;private void registercontentobservers() /通過調(diào)用geturifor方法獲得system表里的"飛行模式"所在行的uriuri airplaneuri = settings.system.geturifor(settings.system.airplane_mode_on);/注冊內(nèi)容觀察者getcontentresolver()registercontentobserver(airplaneuri, false, airplaneco);/ "表“內(nèi)容觀察者,通過測試我

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論