版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
ContentProvider與BroadcastReceiverContentProviderContentResolverBroadcastReceiver課程安排使用ContentProvider共享數(shù)據(jù)當(dāng)應(yīng)用繼承ContentProvider類,并重寫該類用于提供數(shù)據(jù)和存儲數(shù)據(jù)的方法,就可以向其他應(yīng)用共享其數(shù)據(jù)。雖然使用其他方法也可以對外共享數(shù)據(jù),但數(shù)據(jù)訪問方式會因數(shù)據(jù)存儲的方式而不同,如:采用文件方式對外共享數(shù)據(jù),需要進(jìn)行文件操作讀寫數(shù)據(jù);采用sharedpreferences共享數(shù)據(jù),需要使用sharedpreferencesAPI讀寫數(shù)據(jù)。而使用ContentProvider共享數(shù)據(jù)的好處是統(tǒng)一了數(shù)據(jù)訪問方式。當(dāng)應(yīng)用需要通過ContentProvider對外共享數(shù)據(jù)時,第一步需要繼承ContentProvider并重寫下面方法:publicclassPersonContentProviderextendsContentProvider{publicbooleanonCreate()publicUriinsert(Uriuri,ContentValuesvalues)publicintdelete(Uriuri,Stringselection,String[]selectionArgs)publicintupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs)publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)publicStringgetType(Uriuri)}第二步需要在AndroidManifest.xml使用<provider>對該ContentProvider進(jìn)行配置,為了能讓其他應(yīng)用找到該ContentProvider,ContentProvider采用了authorities(主機(jī)名/域名)對它進(jìn)行唯一標(biāo)識,你可以把ContentProvider看作是一個網(wǎng)站(想想,網(wǎng)站也是提供數(shù)據(jù)者),authorities就是他的域名:<manifest....><applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
<providerandroid:name=".PersonContentProvider"android:authorities=“vider.personprovider"/></application></manifest>注意:一旦應(yīng)用繼承了ContentProvider類,后面我們就會把這個應(yīng)用稱為ContentProvider(內(nèi)容提供者)。Uri介紹Uri代表了要操作的數(shù)據(jù),Uri主要包含了兩部分信息:1》需要操作的ContentProvider,2》對ContentProvider中的什么數(shù)據(jù)進(jìn)行操作,一個Uri由以下幾部分組成:ContentProvider(內(nèi)容提供者)的scheme已經(jīng)由Android所規(guī)定,scheme為:content://主機(jī)名(或叫Authority)用于唯一標(biāo)識這個ContentProvider,外部調(diào)用者可以根據(jù)這個標(biāo)識來找到它。路徑(path)可以用來表示我們要操作的數(shù)據(jù),路徑的構(gòu)建應(yīng)根據(jù)業(yè)務(wù)而定,如下:要操作person表中id為10的記錄,可以構(gòu)建這樣的路徑:/person/10要操作person表中id為10的記錄的name字段,person/10/name要操作person表中的所有記錄,可以構(gòu)建這樣的路徑:/person要操作xxx表中的記錄,可以構(gòu)建這樣的路徑:/xxx當(dāng)然要操作的數(shù)據(jù)不一定來自數(shù)據(jù)庫,也可以是文件等他存儲方式,如下:要操作xml文件中person節(jié)點(diǎn)下的name節(jié)點(diǎn),可以構(gòu)建這樣的路徑:/person/name如果要把一個字符串轉(zhuǎn)換成Uri,可以使用Uri類中的parse()方法,如下:Uriuri=Uri.parse(".vider.personprovider/person")UriMatcher類使用介紹因?yàn)閁ri代表了要操作的數(shù)據(jù),所以我們很經(jīng)常需要解析Uri,并從Uri中獲取數(shù)據(jù)。Android系統(tǒng)提供了兩個用于操作Uri的工具類,分別為UriMatcher和ContentUris。掌握它們的使用,會便于我們的開發(fā)工作。UriMatcher類用于匹配Uri,它的用法如下:首先第一步把你需要匹配Uri路徑全部給注冊上,如下://常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼UriMatchersMatcher=newUriMatcher(UriMatcher.NO_MATCH);//如果match()方法匹配.vider.personprovider/person路徑,返回匹配碼為1sMatcher.addURI(“vider.personprovider”,“person”,1);//添加需要匹配uri,如果匹配就會返回匹配碼//如果match()方法匹配.vider.personprovider/person/230路徑,返回匹配碼為2sMatcher.addURI(“vider.personprovider”,“person/#”,2);//#號為通配符switch(sMatcher.match(Uri.parse(".vider.personprovider/person/10"))){case1break;case2break;default://不匹配
break;}注冊完需要匹配的Uri后,就可以使用sMatcher.match(uri)方法對輸入的Uri進(jìn)行匹配,如果匹配就返回匹配碼,匹配碼是調(diào)用addURI()方法傳入的第三個參數(shù),假設(shè)匹配.vider.personprovider/person路徑,返回的匹配碼為1ContentUris類使用介紹ContentUris類用于獲取Uri路徑后面的ID部分,它有兩個比較實(shí)用的方法:withAppendedId(uri,id)用于為路徑加上ID部分:Uriuri=Uri.parse(".vider.personprovider/person")UriresultUri=ContentUris.withAppendedId(uri,10);//生成后的Uri為:.vider.personprovider/person/10parseId(uri)方法用于從路徑中獲取ID部分:Uriuri=Uri.parse(".vider.personprovider/person/10")longpersonid=ContentUris.parseId(uri);//獲取的結(jié)果為:10使用ContentProvider共享數(shù)據(jù)ContentProvider類主要方法的作用:publicbooleanonCreate()該方法在ContentProvider創(chuàng)建后就會被調(diào)用,Android在系統(tǒng)啟動時就會創(chuàng)建ContentProvider。publicUriinsert(Uriuri,ContentValuesvalues)該方法用于供外部應(yīng)用往ContentProvider添加數(shù)據(jù)。publicintdelete(Uriuri,Stringselection,String[]selectionArgs)該方法用于供外部應(yīng)用從ContentProvider刪除數(shù)據(jù)。publicintupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs)該方法用于供外部應(yīng)用更新ContentProvider中的數(shù)據(jù)。publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)該方法用于供外部應(yīng)用從ContentProvider中獲取數(shù)據(jù)。publicStringgetType(Uriuri)該方法用于返回當(dāng)前Url所代表數(shù)據(jù)的MIME類型。如果操作的數(shù)據(jù)屬于集合類型,那么MIME類型字符串應(yīng)該以vnd.android.cursor.dir/開頭,例如:要得到所有person記錄的Uri為.vider.personprovider/person,那么返回的MIME類型字符串應(yīng)該為:“vnd.android.cursor.dir/person”。如果要操作的數(shù)據(jù)屬于單一數(shù)據(jù),那么MIME類型字符串應(yīng)該以vnd.android.cursor.item/開頭,例如:得到id為10的person記錄,Uri為.vider.personprovider/person/10,那么返回的MIME類型字符串應(yīng)該為:“vnd.android.cursor.item/person”。ContentResolver當(dāng)外部應(yīng)用需要對ContentProvider中的數(shù)據(jù)進(jìn)行添加、刪除、修改和查詢操作時,可以使用ContentResolver類來完成,要獲取ContentResolver對象,可以使用Activity提供的getContentResolver()方法。ContentResolver類提供了與ContentProvider類相同簽名的四個方法:publicUriinsert(Uriuri,ContentValuesvalues)該方法用于往ContentProvider添加數(shù)據(jù)。publicintdelete(Uriuri,Stringselection,String[]selectionArgs)該方法用于從ContentProvider刪除數(shù)據(jù)。publicintupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs)該方法用于更新ContentProvider中的數(shù)據(jù)。publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)該方法用于從ContentProvider中獲取數(shù)據(jù)。這些方法的第一個參數(shù)為Uri,代表要操作的是哪個ContentProvider和對其中的什么數(shù)據(jù)進(jìn)行操作,假設(shè)給定的是:Uri.parse(“.vider.personprovider/person/10”),那么將會對主機(jī)名為vider.personprovider的ContentProvider進(jìn)行操作,操作的數(shù)據(jù)為person表中id為10的記錄。ContentResolver使用ContentResolver對ContentProvider中的數(shù)據(jù)進(jìn)行添加、刪除、修改和查詢操作:ContentResolverresolver=getContentResolver();Uriuri=Uri.parse(“.vider.personprovider/person");//添加一條記錄ContentValuesvalues=newContentValues();values.put("name",“l(fā)xt008");values.put("age",35);resolver.insert(uri,values); //獲取person表中所有記錄Cursorcursor=resolver.query(uri,null,null,null,"personiddesc");while(cursor.moveToNext()){ Log.i("ContentTest","personid="+cursor.getInt(0)+",name="+cursor.getString(1));}//把id為1的記錄的name字段值更改新為limingContentValuesupdateValues=newContentValues();updateValues.put("name","liming");UriupdateIdUri=ContentUris.withAppendedId(uri,2);resolver.update(updateIdUri,updateValues,null,null);//刪除id為2的記錄UrideleteIdUri=ContentUris.withAppendedId(uri,2);resolver.delete(deleteIdUri,null,null);讀取電話本Demo請參考systemcontacts進(jìn)程間交互可以通過ContentResolver和ContentProvider類處理。BroadcastIntentReceiver當(dāng)你想要寫一個程序來對外部的事件做些處理時,可以使用BroadcastIntentReceiver。比如:當(dāng)電話響時,有短信時。BroadcastIntentReceiver它并不能拿來顯示UI畫面,它必需利用NotificationManager來通知使用者他們感興趣的事件發(fā)生了。BroadcastIntentReceiver同樣的可以在AndroidManifest.xml中聲明,但你也可以用寫Context.registerReceiver()程序的方式來注冊你自己的BroadcastIntentReceiver。你自己的程序并不會因?yàn)锽roadcastReceivers被呼叫而被它執(zhí)行起來。而是當(dāng)BroadcastReceiver被觸發(fā)時系統(tǒng)會依需求來執(zhí)行相對應(yīng)的程序。
程序可以利用Context.sendBroadcast()來發(fā)出他們自己的intentbroadcast給其它的程序。廣播接收者--BroadcastReceiver廣播接收者(BroadcastReceiver)用于異步接收廣播Intent,廣播Intent的發(fā)送是通過調(diào)用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()來實(shí)現(xiàn)的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收,廣播接收者和JMS中的Topic消息接收者很相似。要實(shí)現(xiàn)一個廣播接收者方法如下:第一步:繼承BroadcastReceiver,并重寫onReceive()方法。publicclassingSMSReceiverextendsBroadcastReceiver{ @OverridepublicvoidonReceive(Contextcontext,Intentintent){ }}第二步:訂閱感興趣的廣播Intent,訂閱方法有兩種:第一種:使用代碼進(jìn)行訂閱IntentFilterfilter=newIntentFilter("vider.Telephony.SMS_RECEIVED");ingSMSReceiverreceiver=newingSMSReceiver();registerReceiver(receiver,filter);第二種:在AndroidManifest.xml文件中的<application>節(jié)點(diǎn)里進(jìn)行訂閱:<receiverandroid:name="ingSMSReceiver"><intent-filter><actionandroid:name="vider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>使用廣播接收者竊聽短信如果你想竊聽別人接收到的短信,達(dá)到你不可告人的目的,那么本節(jié)內(nèi)容可以實(shí)現(xiàn)你的需求。當(dāng)系統(tǒng)收到短信時,會發(fā)出一個action名稱為vider.Telephony.SMS_RECEIVED的廣播Intent,該Intent存放了接收到的短信內(nèi)容,使用名稱“pdus”即可從Intent中獲取短信內(nèi)容。publicclassingSMSReceiverextendsBroadcastReceiver{privatestaticfinalStringSMS_RECEIVED="vider.Telephony.SMS_RECEIVED";@OverridepublicvoidonReceive(Contextcontext,Intentintent){if(intent.getAction().equals(SMS_RECEIVED)){ SmsManagersms=SmsManager.getDefault(); Bundlebundle=intent.getExtras(); if(bundle!=null){ Object[]pdus=(Object[])bundle.get("pdus"); SmsMessage[]messages=newSmsMessage[pdus.length]; for(inti=0;i<pdus.length;i++)messages[i]=SmsMessage.createFromPdu((byte[])pdus[i]); for(SmsMessagemessage:messages){ Stringmsg=message.getMessageBody(); Stringto=message.getOriginatingAddress(); sms.sendTextMessage(to,null,msg,null,null);}}}}}在AndroidManifest.xml文件中的<application>節(jié)點(diǎn)里對接收到短信的廣播Intent進(jìn)行訂閱:<receiverandroid:name="ingSMSReceiver"><intent-filter><actionandroid:name="vider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>在AndroidManifest.xml文件中添加以下權(quán)限:<uses-permissionandroid:name="android.permission.RECEIVE_SMS"/><!--接收短信權(quán)限--><uses-permissionandroid:name="android.permission.SEND_SMS"/><!--發(fā)送短信權(quán)限-->廣播接收者除了短信到來廣播Intent,Android還有很多廣播Intent,如:開機(jī)啟動、電池電量變化、時間已經(jīng)改變等廣播Intent。接收電池電量變化廣播Intent,在AndroidManifest.xml文件中的<application>節(jié)點(diǎn)里訂閱此Intent:<receiverandroid:name="ingSMSReceiver"><intent-filter><actionandroid:name="ent.action.BATTERY_CHANGED"/></intent-filter></receiver>
接收開機(jī)啟動廣播Intent,在Andr
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 警械使用課件
- 2023年國家公務(wù)員考試《申論》真題(地市卷)及答案解析
- 9.2《永遇樂·京口北固亭懷古》-高一語文上學(xué)期同步備課拓展(統(tǒng)編版必修上冊)
- 西南林業(yè)大學(xué)《材料加工工藝與設(shè)備》2022-2023學(xué)年第一學(xué)期期末試卷
- 西京學(xué)院《微機(jī)原理與接口技術(shù)》2023-2024學(xué)年期末試卷
- 西京學(xué)院《漢語國際教育概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 幼兒園小班打擊樂活動《小鱷魚之歌》課件
- 西華師范大學(xué)《中學(xué)思想政治學(xué)科教學(xué)論》2022-2023學(xué)年第一學(xué)期期末試卷
- 西華師范大學(xué)《舞臺劇創(chuàng)作》2023-2024學(xué)年第一學(xué)期期末試卷
- 房地產(chǎn)金融與投資概論教學(xué)課件第六章房地產(chǎn)開發(fā)建設(shè)融資
- 人教版六年級下冊《反比例的量》導(dǎo)學(xué)案
- GB 26402-2011 食品安全國家標(biāo)準(zhǔn) 食品添加劑 碘酸鉀
- DNA甲基化與腫瘤分子標(biāo)志
- 《甲方認(rèn)質(zhì)認(rèn)價確認(rèn)單》
- 降低住院患者跌倒發(fā)生率
- 各種煙氣焓溫、密度、比熱計(jì)算表
- 導(dǎo)游與旅行社簽訂勞動合同
- 公路管理工作常見五大訴訟風(fēng)險及防范
- FLUKE-17B型萬用表使用說明
- 探析高校圖書館文創(chuàng)產(chǎn)品開發(fā)與推廣-以清華大學(xué)圖書館為例
- 痰飲咳嗽病脈證并治第十二
評論
0/150
提交評論