android学习笔记五。2、其他组件
一、ContentProvider內(nèi)容提供者.是是android中一個(gè)應(yīng)用向第三方共享數(shù)據(jù)的方式,android中的聯(lián)系人,sms(短信記錄)等都是通過這一方式來向外提供的
1、使用:
在應(yīng)用中使用ContentProvider提供的數(shù)據(jù)并不是直接使用的,而是需要通過ContentResolver來實(shí)現(xiàn)的,ContentResolver中包含query/insert/delete/update等方法用于操作數(shù)據(jù),但其內(nèi)部就是調(diào)用ContentProvider的實(shí)現(xiàn)類來真正操作的。
使用ContentProvider獲取sms數(shù)據(jù)的例子上面的使用過程分三步:
①指定訪問URI,
②通過getContentResolver()獲取ContentResolver對(duì)象,然后進(jìn)行增刪改查操作
③對(duì)獲取數(shù)據(jù)/結(jié)果進(jìn)行處理。
上面是簡(jiǎn)述,下面對(duì)其中使用的內(nèi)容進(jìn)行詳細(xì)說明:
①、URI:最早使用到的地方就是在Intent進(jìn)行匹配的時(shí)候,其實(shí)這時(shí)的URI是和data向匹配的:
content:// com.example.project :200????? /folder/subfolder/etc
\---------/? \---------------------------/ \---/ \--------------------------/
scheme???????????????? host?????????????? port??????? path
??????????????? \--------------------------------/
????????????????????????? authority? ?
現(xiàn)在大家應(yīng)該知道data flag中那些屬性的含義了吧,看下data flag
<data android:host="string"
???? ? android:mimeType="string"
????? android:path="string"
????? android:pathPattern="string"
???? ? android:pathPrefix="string"
???? ? android:port="string"
????? android:scheme="string" />
在使用ContentProvider時(shí)對(duì)URI有一個(gè)要求:就是其scheme必須是content,原因見2.
注意:關(guān)于匹配ContentProvider的URI規(guī)則見自定義ContentProvider部分。
②、以query()為例,ContentResolver對(duì)象最終會(huì)調(diào)用的方法的源碼見下
ContentResolver源碼其中可以看到第一步是檢測(cè)傳入的uri是否為空,第二部就是對(duì)傳入uri的scheme進(jìn)行檢測(cè),判斷其是否為content
cquireUnstableProvider源碼(檢測(cè)uri的scheme)同時(shí)可以看到是調(diào)用了ContentProvider對(duì)象進(jìn)行真正的查詢操作。這樣做是為了簡(jiǎn)化對(duì)ContentProvider的操作,和進(jìn)行安全檢測(cè)等。
③、增刪查改中最重要的就是查詢的結(jié)果即Cursor的處理。Cursor就是一個(gè)數(shù)據(jù)的集合,可以獲取某一行然后讀取其中的數(shù)據(jù)。該類是一個(gè)接口類。
2、自定義ContentProvider:這是自己項(xiàng)目對(duì)外提供數(shù)據(jù)的一種方式,最好的方式就是以android提供的范本進(jìn)行創(chuàng)建,這里參考的是android的sample:notepad。這個(gè)項(xiàng)目中有3個(gè)文件比較重要,詳細(xì)說明:
1、NodePad.java:這個(gè)類中定義了一些與訪問有關(guān)的屬性,例如URI,列的名字等。這個(gè)類要和ContentProvider配合使用。
NotePad.java2、NotePadProvider.java:這個(gè)類就是自定義的ContentProvider,需要繼承ContentProvider類并至少實(shí)現(xiàn)增刪改查方法還有構(gòu)造方法。在這個(gè)例子中,可以看到使用了以下幾個(gè)類:
①DatabaseHelper:一個(gè)數(shù)據(jù)庫(kù)幫助類,繼承自SQLiteOpenHelper。
DatabaseHelper源碼②UriMatcher:這個(gè)對(duì)象的作用是用來指定匹配該ContentProvider的URI的匹配規(guī)則。
UriMatcher部分源碼③SQLiteQueryBuilder:該類是用來構(gòu)建查詢語句的。
?
3、AndroidManifest.xml:這里需要注意的是清單文件中provider聲明的部分
清單文件其中比較重要的是android:authorities和權(quán)限的聲明,其實(shí)ContentProvider有非常復(fù)雜的權(quán)限管理,詳見:http://iwillbemyself.blog.163.com/blog/static/1702232282012115104056917/,
對(duì)于自定義ContentProvider還有一點(diǎn)比較重要的就是當(dāng)操作的數(shù)據(jù)庫(kù)有所改變時(shí),應(yīng)該通知相應(yīng)的ContentObserver(內(nèi)容觀察者)進(jìn)行處理。
二、BroadcastReceiver廣播接收者,廣播是Android中傳遞事件的方式,有兩個(gè)方面:廣播發(fā)送者和廣播接收者。
1、廣播發(fā)送者可以發(fā)送兩種廣播:同步廣播和有序廣播,兩者的區(qū)別是
①接收順序的區(qū)別:同步廣播同步接收,有序廣播可以通過指定優(yōu)先級(jí)來設(shè)置接收順序
②是否可以中斷的區(qū)別:由于有序廣播有順序,才有可能將廣播進(jìn)行中斷,不讓后來者進(jìn)行接收;而同步廣播則不能中斷。
2、廣播接收者:廣播發(fā)送的具體內(nèi)容就是一個(gè)隱式意圖對(duì)象(因?yàn)橥ǔJ墙o另外的應(yīng)用使用的),接收者通過兩步來實(shí)現(xiàn)
①在清單文件中進(jìn)行配置,
②繼承BroadcastReceiver對(duì)象,并重寫onReceive方法,在其中實(shí)現(xiàn)功能即可。
有序廣播通過指定優(yōu)先級(jí)來確定接收順序,優(yōu)先級(jí)從-1000~1000,
①如果同一個(gè)應(yīng)用中的優(yōu)先級(jí)相同,則在清單文件中前面的先接收
②如果不同應(yīng)用中的優(yōu)先級(jí)相同,則先安裝的應(yīng)用先接收
參考:http://blog.csdn.net/xiazdong/article/details/7768807,
http://www.runoob.com/w3cnote/android-tutorial-broadcastreceiver.html
轉(zhuǎn)載于:https://www.cnblogs.com/songfeilong2325/p/5446546.html
總結(jié)
以上是生活随笔為你收集整理的android学习笔记五。2、其他组件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于bootstrap 的AceAdmi
- 下一篇: 推荐一款好用的Bootstrap后台管理