




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、ContentProvider與BroadcastReceiver課程安排nContentProvidernContentResolvernBroadcastReceiverContentProviderContentProvider是不同應用程序之間進行數(shù)據(jù)交換的標準API, ContentProvider以一些Uri的形式對外提供數(shù)據(jù),允許其它應用訪問或修改數(shù)據(jù);其它應用程序使用ContentProvider根據(jù)Uri去訪問操作指定數(shù)據(jù)完整地開發(fā)一個ContentProvider步驟如下:1.定義FirstProvider類,并繼承Android提供的ContentProvider類,并復
2、寫下列方法:onCreate() 初始化內(nèi)容提供器的時候調(diào)用。通常會在這里完成對數(shù)據(jù)庫的創(chuàng)建和升級等操作,返回 true 表示內(nèi)容提供器初始化成功,返回 false 則表示失敗。注意,只有當存在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來返回相應的 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)用于唯一標識這個ContentProvider,外部調(diào)用者可以根據(jù)這個標識來找到它。路徑(path)可以用來表示我們要操作的數(shù)據(jù),路徑的構(gòu)建應根據(jù)業(yè)務而定,如下:要操作p
5、erson表中id為10的記錄,可以構(gòu)建這樣的路徑:/person/10要操作person表中id為10的記錄的name字段, person/10/name要操作person表中的所有記錄,可以構(gòu)建這樣的路徑:/person要操作xxx表中的記錄,可以構(gòu)建這樣的路徑:/xxx當然要操作的數(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ù),假設匹配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)該方法用于供外部應用往ContentProvider添加數(shù)據(jù)。public int delete(Uri uri, String selection, String selectionArgs)該方法用于供外部應用從ContentProvider刪除數(shù)據(jù)。public int update(Uri uri, ContentValues values, String selection, String selectionArgs)該方法用于供外部應用更新ContentProvider中的數(shù)據(jù)。public Cursor query(Uri uri, Str
12、ing projection, String selection, String selectionArgs, String sortOrder)該方法用于供外部應用從ContentProvider中獲取數(shù)據(jù)。public String getType(Uri uri)該方法用于返回當前Url所代表數(shù)據(jù)的MIME類型。如果操作的數(shù)據(jù)屬于集合類型,那么MIME類型字符串應該以vnd.android.cursor.dir/開頭,例如:要得到所有person記錄的Uri為content:/vider.personprovider/person,那么返回的MIME類型字符串
13、應該為:“vnd.android.cursor.dir/person”。如果要操作的數(shù)據(jù)屬于單一數(shù)據(jù),那么MIME類型字符串應該以vnd.android.cursor.item/開頭,例如:得到id為10的person記錄,Uri為content:/vider.personprovider/person/10,那么返回的MIME類型字符串應該為:“vnd.android.cursor.item/person”。 源碼詳見FirstProviderContentResolver當外部應用需要對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ù)進行操作,假設給
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應用程序來管理聯(lián)系人,而且Android系統(tǒng)還為聯(lián)系人管理提供了ContentProvider,這里允許其它應用程序以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當你想要寫一個程序來對外部的事件做些處理時,可以使用Broadcast Intent Receiver。比如:當電話響時,有短信時。Broadcast Intent Receiver它并不能拿來顯示UI畫面,它必需利用NotificationManager來通知使用者他們感興趣的事件發(fā)生了。Broadcast Intent Re
22、ceiver同樣的可以在AndroidManifest.xml中聲明,但你也可以用寫 Context.registerReceiver()程序的方式來注冊你自己的Broadcast Intent Receiver。你自己的程序并不會因為BroadcastReceivers被呼叫而被它執(zhí)行起來。而是當BroadcastReceiver被觸發(fā) 時系統(tǒng)會依需求來執(zhí)行相對應的程序。程序可以利用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)你的需求。當系統(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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度河北省護師類之護士資格證自測模擬預測題庫
- 2025江蘇揚州人才集團下屬企業(yè)招聘6人筆試備考題庫及一套參考答案詳解
- 2024年度河北省護師類之婦產(chǎn)護理主管護師自我檢測試卷B卷附答案
- 2024年邯鄲市成安縣招聘村黨務(村務)工作者考試真題及一套答案詳解
- 2025廣西來賓市招聘鄉(xiāng)村振興專員221人筆試備考題庫參考答案詳解
- 湖南省名校聯(lián)盟2024-2025學年高二上學期入學考試物理試題(解析版)
- 護理中的急救知識教育
- 2025年3月四川省中職單招語文試題卷附答案解析
- 2025年嬰幼兒配方食品營養(yǎng)配方調(diào)整與嬰幼兒早期教育研究報告
- 2019-2025年一級注冊建筑師之建筑設計題庫綜合試卷B卷附答案
- 地面地磚檢修方案(3篇)
- 公司工會內(nèi)控管理制度
- 食堂燃氣培訓試題及答案
- T/CEPPEA 5028-2023陸上風力發(fā)電機組預應力預制混凝土塔筒施工與質(zhì)量驗收規(guī)范
- 研究生學術(shù)表達能力培養(yǎng)智慧樹知到答案2024年西安建筑科技大學、清華大學、同濟大學、山東大學、河北工程大學、《環(huán)境工程》英文版和《環(huán)境工程》編輯部
- 《牙體牙髓病學》課件-蓋髓術(shù)適應證及操作方法
- 供電公司一把手講安全
- 城市經(jīng)濟學習題與答案
- 建設項目工程總承包合同 GF—2020—0216
- 商業(yè)銀行法定存款準備金繳存操作規(guī)程
- 混凝土施工技術(shù)試題
評論
0/150
提交評論