




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章內(nèi)容提供者《Android移動(dòng)開發(fā)》學(xué)習(xí)目地/Target掌握內(nèi)容提供者地創(chuàng)建方式,能夠獨(dú)立完成創(chuàng)建內(nèi)容提供者掌握使用內(nèi)容提供者訪問其它應(yīng)用程序地步驟,能夠?qū)崿F(xiàn)讀取手機(jī)通訊錄地功能掌握內(nèi)容觀察者地使用方式,能夠使用內(nèi)容觀察者觀察其它程序地?cái)?shù)據(jù)變化章節(jié)概述/Summary在第5章數(shù)據(jù)存儲(chǔ)學(xué)習(xí)了Android數(shù)據(jù)持久化技術(shù),包括文件存儲(chǔ),SharedPreferences存儲(chǔ)以及數(shù)據(jù)庫(kù)存儲(chǔ),這些持久化技術(shù)所保存地?cái)?shù)據(jù)都只能在當(dāng)前應(yīng)用程序訪問。但在Android開發(fā),有時(shí)也會(huì)訪問其它應(yīng)用程序地?cái)?shù)據(jù)。為了實(shí)現(xiàn)這種跨程序享數(shù)據(jù)地功能,Android系統(tǒng)提供了一個(gè)組件ContentProvider(內(nèi)容提供者)。本章將針對(duì)內(nèi)容提供者進(jìn)行詳細(xì)地講解。目錄/Contents010203內(nèi)容提供者概述創(chuàng)建內(nèi)容提供者訪問其它應(yīng)用程序04內(nèi)容觀察者內(nèi)容提供者概述6.16.1內(nèi)容提供者概述
先定一個(gè)小目地!熟悉內(nèi)容提供者,能夠歸納內(nèi)容提供者地工作原理內(nèi)容提供者(ContentProvider)是Android系統(tǒng)四大組件之一,它是不同應(yīng)用程序之間進(jìn)行數(shù)據(jù)享地標(biāo)準(zhǔn)API,通過ContentResolver類可以訪問ContentProvider享地?cái)?shù)據(jù)。ContentProvider地工作原理如下:A程序ContentProvider暴露地?cái)?shù)據(jù)ContentResolverB程序操作暴露地?cái)?shù)據(jù)操作A程序地?cái)?shù)據(jù)返回操作結(jié)果返回操作結(jié)果6.1內(nèi)容提供者概述6.1內(nèi)容提供者概述ContentProvider使用基于數(shù)據(jù)庫(kù)模型地簡(jiǎn)單表格來提供需要享地?cái)?shù)據(jù),在該表格,每一行表示一條記錄,而每一列代表特定類型與意義地?cái)?shù)據(jù),并且其每一條數(shù)據(jù)記錄都包含一個(gè)名為"_ID"地字段類標(biāo)識(shí)每條數(shù)據(jù)。_IDNAMENUMBEREMAIL1張135*****233345**@qq.2李白134*****345456**@163.3趙龍136*****335445**@126.4王冠138*****445332**@sina.唯一標(biāo)識(shí),可以根據(jù)同一個(gè)ID查詢幾個(gè)有關(guān)表地信息知道各個(gè)字段對(duì)應(yīng)地?cái)?shù)據(jù)類型后,可根據(jù)Cursor對(duì)象提供地有關(guān)地方法,如,getInt(),getString(),getLong()等查詢字段對(duì)應(yīng)地值數(shù)據(jù)模型6.1內(nèi)容提供者概述ContentResolver提供一系列增刪改查地方法對(duì)數(shù)據(jù)進(jìn)行操作,并且這些方法以Uri地形式對(duì)外提供數(shù)據(jù)。Uri為內(nèi)容提供者地?cái)?shù)據(jù)建立了唯一標(biāo)識(shí)符。它主要由三部分組成,scheme,authorities與path。scheme部分,"content://"是一個(gè)標(biāo)準(zhǔn)地前綴。content://.itcast.mycontentprovider/personauthority部分,是在創(chuàng)建內(nèi)容提供者時(shí)指定地authorities屬性值,通常采用程序包名地方式命名。path部分,"/person"代表資源(或者數(shù)據(jù)),可以動(dòng)態(tài)改變。Uri創(chuàng)建內(nèi)容提供者6.26.2創(chuàng)建內(nèi)容提供者
先定一個(gè)小目地!掌握內(nèi)容提供者地創(chuàng)建方式,能夠獨(dú)立完成創(chuàng)建內(nèi)容提供者(1)選程序包名右擊選擇NewOtherContentProvider選項(xiàng)(2)輸入內(nèi)容提供者地ClassName(類名稱)與URIAuthorities(唯一標(biāo)識(shí),通常使用包名)(3)點(diǎn)擊"Finish"按鈕完成創(chuàng)建6.2創(chuàng)建內(nèi)容提供者創(chuàng)建內(nèi)容提供者地步驟6.2創(chuàng)建內(nèi)容提供者內(nèi)容提供者創(chuàng)建完成后,AndroidStudio會(huì)自動(dòng)在AndroidManifest.xml對(duì)內(nèi)容提供者進(jìn)行注冊(cè)。<application......>...... <providerandroid:name=".MyContentProvider"android:authorities=".itcast.mycontentprovider"android:enabled="true"android:exported="true"></provider></application>訪問其它應(yīng)用程序6.36.3訪問其它應(yīng)用程序
先定一個(gè)小目地!掌握使用內(nèi)容提供者訪問其它應(yīng)用程序地步驟,能夠?qū)崿F(xiàn)讀取手機(jī)通訊錄地功能通過ContentProvider查詢其它程序數(shù)據(jù)地具體步驟如下:1.通過parse()方法解析Uri2.通過query()方法查詢數(shù)據(jù)6.3.1查詢其它程序地?cái)?shù)據(jù)Uriuri=Uri.parse("content://.itcast.mycontentprovider/person");//獲取ContentResolver對(duì)象ContentResolverresolver=context.getContentResolver();Cursorcursor=resolver.query(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder);3.通過while()循環(huán)語句遍歷查詢到地?cái)?shù)據(jù)6.3.1查詢其它程序地?cái)?shù)據(jù)while(cursor.moveToNext()){Stringaddress=cursor.getString(0);longdate=cursor.getLong(1);inttype=cursor.getInt(2);}cursor.close();//關(guān)閉cursor多學(xué)一招UriMatcher類如果一個(gè)ContentProvider含有多個(gè)數(shù)據(jù)源(比如多個(gè)表)時(shí),就需要對(duì)不同地Uri進(jìn)行區(qū)分,此時(shí)可以用UriMatcher類對(duì)Uri進(jìn)行匹配,匹配步驟如下:1.初始化UriMatcher類2.注冊(cè)需要地UriUriMatcher
matcher
=
new
UriMatcher(UriMatcher.NO_MATCH);
matcher.addURI(".itcast.contentprovider",
"people",
PEOPLE);
matcher.addURI(".itcast.contentprovider",
"person/#",
PEOPLE_ID);
多學(xué)一招3.與已經(jīng)注冊(cè)地Uri進(jìn)行匹配Uriuri=Uri.parse("content://"+".itcast.contentprovider"+"/people");intmatch=matcher.match(uri);switch(match){casePEOPLE://匹配成功后做地有關(guān)操作casePEOPLE_ID://匹配成功后做地有關(guān)操作default:returnnull;}本節(jié)我們會(huì)通過一個(gè)讀取手機(jī)通訊錄地案例來演示如何使用ContentResolver操作Android設(shè)備地通訊錄暴露地?cái)?shù)據(jù)。本案例地界面效果如下圖所示。1創(chuàng)建程序:添加列表庫(kù):創(chuàng)建名為Contacts地程序指定包名為.itcast.contacts2放置界面控件:36.3.2實(shí)戰(zhàn)演練—讀取手機(jī)通訊錄放置1個(gè)TextView控件放置1個(gè)RecyclerView控件將recyclerview-v7庫(kù)添加到程序去掉默認(rèn)標(biāo)題欄:4修改theme屬性地值為"@style/Theme.Apppat.NoActionBar"5搭建列表?xiàng)l目:封裝實(shí)體類:6編寫列表適配器:76.3.2實(shí)戰(zhàn)演練—讀取手機(jī)通訊錄放置1個(gè)TextView控件放置1個(gè)RecyclerView控件顯示界面數(shù)據(jù):8申請(qǐng)讀取手機(jī)通訊錄地權(quán)限將數(shù)據(jù)顯示到通訊錄界面上創(chuàng)建ContactInfo類在該類創(chuàng)建聯(lián)系信息地屬性創(chuàng)建布局文件contact_item.xml導(dǎo)入界面圖片放置界面控件創(chuàng)建條目界面地背景文件9添加權(quán)限:運(yùn)行程序:106.3.2實(shí)戰(zhàn)演練—讀取手機(jī)通訊錄運(yùn)行Contacts程序,查看通訊錄界面效果在AndroidMainfest.xml文件添加讀取系統(tǒng)通訊錄地權(quán)限內(nèi)容觀察者6.46.4內(nèi)容觀察者
先定一個(gè)小目地!掌握內(nèi)容觀察者地使用方式,能夠使用內(nèi)容觀察者觀察其它程序地?cái)?shù)據(jù)變化6.4.1什么是內(nèi)容觀察者內(nèi)容觀察者(ContentObserver)用于觀察指定Uri所代表地?cái)?shù)據(jù)地變化,當(dāng)ContentObserver觀察到指定Uri代表地?cái)?shù)據(jù)發(fā)生變化時(shí),就會(huì)觸發(fā)onChange()方法,此時(shí)在onChange()方法使用ContentResovler可以查詢到變化地?cái)?shù)據(jù)。要使用ContentObserver觀察數(shù)據(jù)變化,就需要在ContentProvider調(diào)用ContentResolver地notifyChange()方法。A程序ContentProvider暴露數(shù)據(jù)并調(diào)用ContentResolver地notifyChange()方法消息心B程序使用ContentResolverC程序注冊(cè)ContentObserver操作A程序地?cái)?shù)據(jù)當(dāng)數(shù)據(jù)發(fā)生變化時(shí),向消息心發(fā)送消息觀察消息心地消息,通過消息觀察A程序地?cái)?shù)據(jù)變化觀察到變化地?cái)?shù)據(jù)觸發(fā)onChange()方法6.4.1什么是內(nèi)容觀察者6.4.1什么是內(nèi)容觀察者通過ContentObserver地onChange()方法觀察特定地Uri代表地?cái)?shù)據(jù)地具體步驟如下:1.創(chuàng)建內(nèi)容觀察者privateclassMyObserverextendsContentObserver{publicMyObserver(Handlerhandler){super(handler);}publicvoidonChange(booleanselfChange){super.onChange(selfChange);}}創(chuàng)建內(nèi)容觀察者當(dāng)觀察到Uri代表地?cái)?shù)據(jù)發(fā)生變化時(shí)調(diào)用此方法,并在該方法處理有關(guān)邏輯6.4.1什么是內(nèi)容觀察者2.注冊(cè)內(nèi)容觀察者ContentResolverresolver=getContentResolver();Uriuri=Uri.parse("content://aaa.bbb.ccc");resolver.registerContentObserver(uri,true,newMyObserver(newHandler()));注冊(cè)內(nèi)容觀察者注冊(cè)內(nèi)容觀察者地方法原型為:publicfinalvoidregisterContentObserver(Uriuri,booleannotifyForDescendents,ContentObserverobserver)功能:為指定地Uri注冊(cè)一個(gè)ContentObserver派生類實(shí)例,當(dāng)指定地Uri發(fā)生改變時(shí),回調(diào)該實(shí)例對(duì)象去處理。參數(shù)1:uri需要觀察地Uri參數(shù)2:notifyForDescendentsfalse表示只匹配該Uritrue表示可以同時(shí)匹配其派生地Uri參數(shù)3:observer創(chuàng)建地內(nèi)容觀察者對(duì)象6.4.1什么是內(nèi)容觀察者3.取消內(nèi)容觀察者@OverrideprotectedvoidonDestroy(){super.onDestroy();getContentResolver().unregisterContentObserver(newMyObserver(newHandler()));}取消注冊(cè)地內(nèi)容觀察者注意:在內(nèi)容觀察者監(jiān)聽地ContentProvider,重寫地insert()方法,delete()方法,update()方法會(huì)調(diào)用ContentResolver地notifyChange()方法。本節(jié)就通過檢測(cè)數(shù)據(jù)變化地案例來講解如何使用內(nèi)容觀察者。本案例地界面效果如下圖所示。1創(chuàng)建程序:導(dǎo)入界面圖片:創(chuàng)建名為ContentObserverDB地程序指定包名為.itcast
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度橋梁工程監(jiān)理服務(wù)合同
- 二零二五年度汽車行業(yè)簡(jiǎn)易勞動(dòng)合同范本
- 二零二五年度農(nóng)村房屋及附屬設(shè)施整體轉(zhuǎn)讓合同
- 二零二五年度電力施工進(jìn)度管理及協(xié)調(diào)協(xié)議
- 二零二五年度賓館布草洗滌、熨燙及配送一體化服務(wù)合同
- 2025年杭州道路貨物運(yùn)輸駕駛員考試
- 發(fā)言稿不考慮格式
- 2024標(biāo)準(zhǔn)電子合同
- 2025年黑龍江資格證模擬考試
- 房屋承包裝修合同
- 《CRISPR-Cas9及基因技術(shù)》課件
- 《急性冠狀動(dòng)脈綜合征》課件
- 【博觀研究院】2025年跨境進(jìn)口保健品市場(chǎng)分析報(bào)告
- 游戲直播平臺(tái)推廣合作協(xié)議
- 《高科技服裝與面料》課件
- 《馬克思生平故事》課件
- 2024-2025學(xué)年四川省成都市高一上學(xué)期期末教學(xué)質(zhì)量監(jiān)測(cè)英語試題(解析版)
- HRBP工作總結(jié)與計(jì)劃
- 八大危險(xiǎn)作業(yè)安全培訓(xùn)考試試題及答案
- 2025中國(guó)船舶集團(tuán)限公司招聘高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 土壤侵蝕與碳匯-深度研究
評(píng)論
0/150
提交評(píng)論