第10章 ContentProvider與BroadcastReceiver_第1頁
第10章 ContentProvider與BroadcastReceiver_第2頁
第10章 ContentProvider與BroadcastReceiver_第3頁
第10章 ContentProvider與BroadcastReceiver_第4頁
第10章 ContentProvider與BroadcastReceiver_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、ContentProvider與BroadcastReceiver課程安排nContentProvidernContentResolvernBroadcastReceiverContentProviderContentProvider是不同應用程序之間進行數據交換的標準API, ContentProvider以一些Uri的形式對外提供數據,允許其它應用訪問或修改數據;其它應用程序使用ContentProvider根據Uri去訪問操作指定數據完整地開發(fā)一個ContentProvider步驟如下:1.定義FirstProvider類,并繼承Android提供的ContentProvider類,并復

2、寫下列方法:onCreate() 初始化內容提供器的時候調用。通常會在這里完成對數據庫的創(chuàng)建和升級等操作,返回 true 表示內容提供器初始化成功,返回 false 則表示失敗。注意,只有當存在ContentResolver嘗試訪問我們程序中的數據時,內容提供器才會被初始化。query() 從內容提供器中查詢數據。使用uri參數來確定查詢哪張表,projection參數用于確定查詢哪些列,selection和 selectionArgs參數用于約束查詢哪些行,sortOrder參數用于對結果進行排序,查詢的結果存放在Cursor對象中返回。insert() 向內容提供器中添加一條數據。使用 u

3、ri參數來確定要添加到的表,待添加的數據保存在values參數中。添加完成后,返回一個用于表示這條新記錄的URI。update() 更新內容提供器中已有的數據。使用 uri參數來確定更新哪一張表中的數據,新數據保存在values參數中,selection和selectionArgs參數用于約束更新哪些行,受影響的行數將作為返回值返回。delete() 從內容提供器中刪除數據。使用 uri 參數來確定刪除哪一張表中的數據,selection和selectionArgs參數用于約束刪除哪些行,被刪除的行數將作為返回值返回。getType()根據傳入的內容 URI來返回相應的 MIME類型。2.在A

4、ndroidManifest.xml文件中注冊這個ContentProvider.Uri介紹Uri代表了要操作的數據,Uri主要包含了兩部分信息:1需要操作的ContentProvider ,2對ContentProvider中的什么數據進行操作,一個Uri由以下幾部分組成:ContentProvider(內容提供者)的scheme已經由Android所規(guī)定, scheme為:content:/主機名(或叫Authority)用于唯一標識這個ContentProvider,外部調用者可以根據這個標識來找到它。路徑(path)可以用來表示我們要操作的數據,路徑的構建應根據業(yè)務而定,如下:要操作p

5、erson表中id為10的記錄,可以構建這樣的路徑:/person/10要操作person表中id為10的記錄的name字段, person/10/name要操作person表中的所有記錄,可以構建這樣的路徑:/person要操作xxx表中的記錄,可以構建這樣的路徑:/xxx當然要操作的數據不一定來自數據庫,也可以是文件等他存儲方式,如下:要操作xml文件中person節(jié)點下的name節(jié)點,可以構建這樣的路徑:/person/name如果要把一個字符串轉換成Uri,可以使用Uri類中的parse()方法,如下:Uri uri = Uri.parse(content:/com.lxt008.pr

6、ovider.personprovider/person) UriMatcher類使用介紹因為Uri代表了要操作的數據,所以我們經常需要解析Uri,并從Uri中獲取數據。Android系統提供了兩個用于操作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進行匹配,如果匹配就返回匹配碼,匹配碼是調用addURI()方法傳入的第三個參數,假設匹配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);/獲取的結果為:10使用ContentProvider共享數據ContentProvider類主要方法的作用:public boolean onCreate()該方法在ContentProvider創(chuàng)建后就會被調用, Android在系統啟動時就會創(chuàng)建ContentProvider 。public Uri insert(Uri uri, C

11、ontentValues values)該方法用于供外部應用往ContentProvider添加數據。public int delete(Uri uri, String selection, String selectionArgs)該方法用于供外部應用從ContentProvider刪除數據。public int update(Uri uri, ContentValues values, String selection, String selectionArgs)該方法用于供外部應用更新ContentProvider中的數據。public Cursor query(Uri uri, Str

12、ing projection, String selection, String selectionArgs, String sortOrder)該方法用于供外部應用從ContentProvider中獲取數據。public String getType(Uri uri)該方法用于返回當前Url所代表數據的MIME類型。如果操作的數據屬于集合類型,那么MIME類型字符串應該以vnd.android.cursor.dir/開頭,例如:要得到所有person記錄的Uri為content:/vider.personprovider/person,那么返回的MIME類型字符串

13、應該為:“vnd.android.cursor.dir/person”。如果要操作的數據屬于單一數據,那么MIME類型字符串應該以vnd.android.cursor.item/開頭,例如:得到id為10的person記錄,Uri為content:/vider.personprovider/person/10,那么返回的MIME類型字符串應該為:“vnd.android.cursor.item/person”。 源碼詳見FirstProviderContentResolver當外部應用需要對ContentProvider中的數據進行添加、刪除、修改和查詢操作時,可以

14、使用ContentResolver 類來完成,要獲取ContentResolver 對象,可以使用Activity提供的getContentResolver()方法。 ContentResolver 類提供了與ContentProvider類相同簽名的四個方法:public Uri insert(Uri uri, ContentValues values)該方法用于往ContentProvider添加數據。public int delete(Uri uri, String selection, String selectionArgs)該方法用于從ContentProvider刪除數據。pub

15、lic int update(Uri uri, ContentValues values, String selection, String selectionArgs)該方法用于更新ContentProvider中的數據。public Cursor query(Uri uri, String projection, String selection, String selectionArgs, String sortOrder)該方法用于從ContentProvider中獲取數據。這些方法的第一個參數為Uri,代表要操作的是哪個ContentProvider和對其中的什么數據進行操作,假設給

16、定的是: Uri.parse(“content:/vider.personprovider/person/10”),那么將會對主機名為vider.personprovider的ContentProvider進行操作,操作的數據為person表中id為10的記錄。ContentResolver使用ContentResolver對ContentProvider中的數據進行添加、刪除、修改和查詢操作: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系統提供了Contacts應用程序來管理聯系人,而且Android系統還為聯系人管理提供了ContentProvider,這里允許其它應用程序以ContentResolver來管理聯系人數據.管理聯系人的URIContactsContract.Contacts.CONTENT_URI管理聯系人電話的URIContactsContract.CommonDataKinds.Phone.CONTENT_UR

20、I管理聯系人E-mail的URIContactsContract.CommonDataKinds.Email.CONTENT_URI/ 使用ContentResolver查找聯系人數據Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null,null, null);/ 獲取聯系人IDString contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID);/ 獲取聯

21、系人的名字String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);注意給APP添加訪問權限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ā) 時系統會依需求來執(zhí)行相對應的程序。程序可以利用Context.sendBroadcast()來發(fā)出他們自己的intent broadcast給其它的程序。廣播接收者-BroadcastReceiver廣播接收者(BroadcastReceiver)用于異步接

23、收廣播Intent,廣播Intent的發(fā)送是通過調用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()來實現的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收。要實現一個廣播接收者方法如下:第一步:繼承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é)內容可以實現你的需求。當系統收到短信時,會發(fā)出一個action名稱為vider.Telephony.SMS_RECEIVED的廣播Intent,該Intent存放了接收到的短信內容,使用名稱“pdus”即可從Intent中獲取短信內容。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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論