標籤:
一、ContentProvider內容提供者.是是android中一個應用向第三方共用資料的方式,android中的連絡人,sms(簡訊記錄)等都是通過這一方式來向外提供的
1、使用:
在應用中使用ContentProvider提供的資料並不是直接使用的,而是需要通過ContentResolver來實現的,ContentResolver中包含query/insert/delete/update等方法用於操作資料,但其內部就是調用ContentProvider的實作類別來真正操作的。
使用ContentProvider擷取sms資料的例子
上面的使用過程分三步:
①指定訪問URI,
②通過getContentResolver()擷取ContentResolver對象,然後進行增刪改查操作
③對擷取資料/結果進行處理。
上面是簡述,下面對其中使用的內容進行詳細說明:
①、URI:最早使用到的地方就是在Intent進行匹配的時候,其實這時的URI是和data向匹配的:
content:// com.example.project :200 /folder/subfolder/etc
\---------/ \---------------------------/ \---/ \--------------------------/
scheme host port path
\--------------------------------/
authority
現在大家應該知道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時對URI有一個要求:就是其scheme必須是content,原因見2.
注意:關於匹配ContentProvider的URI規則見自訂ContentProvider部分。
②、以query()為例,ContentResolver對象最終會調用的方法的源碼見下
ContentResolver源碼
其中可以看到第一步是檢測傳入的uri是否為空白,第二部就是對傳入uri的scheme進行檢測,判斷其是否為content
cquireUnstableProvider源碼(檢測uri的scheme)
同時可以看到是調用了ContentProvider對象進行真正的查詢操作。這樣做是為了簡化對ContentProvider的操作,和進行安全檢測等。
③、增刪查改中最重要的就是查詢的結果即Cursor的處理。Cursor就是一個資料的集合,可以擷取某一行然後讀取其中的資料。該類是一個介面類。
2、自訂ContentProvider:這是自己項目對外提供資料的一種方式,最好的方式就是以android提供的範本進行建立,這裡參考的是android的sample:notepad。這個項目中有3個檔案比較重要,詳細說明:
1、NodePad.java:這個類中定義了一些與訪問有關的屬性,例如URI,列的名字等。這個類要和ContentProvider配合使用。
NotePad.java
2、NotePadProvider.java:這個類就是自訂的ContentProvider,需要繼承ContentProvider類並至少實現增刪改查方法還有構造方法。在這個例子中,可以看到使用了以下幾個類:
①DatabaseHelper:一個資料庫協助類,繼承自SQLiteOpenHelper。
DatabaseHelper源碼
②UriMatcher:這個對象的作用是用來指定匹配該ContentProvider的URI的匹配規則。
UriMatcher部分源碼
③SQLiteQueryBuilder:該類是用來構建查詢語句的。
3、AndroidManifest.xml:這裡需要注意的是資訊清單檔中provider聲明的部分
資訊清單檔
其中比較重要的是android:authorities和許可權的聲明,其實ContentProvider有非常複雜的許可權管理,詳見:http://iwillbemyself.blog.163.com/blog/static/1702232282012115104056917/,
對於自訂ContentProvider還有一點比較重要的就是當操作的資料庫有所改變時,應該通知相應的ContentObserver(內容觀察者)進行處理。
二、BroadcastReceiver廣播接收者,廣播是Android中傳遞事件的方式,有兩個方面:廣播寄件者和廣播接收者。
1、廣播寄件者可以發送兩種廣播:同步廣播和有序廣播,兩者的區別是
①接收順序的區別:同步廣播同步接收,有序廣播可以通過指定優先順序來設定接收順序
②是否可以中斷的區別:由於有序廣播有順序,才有可能將廣播進行中斷,不讓後來者進行接收;而同步廣播則不能中斷。
2、廣播接收者:廣播發送的具體內容就是一個隱式意圖對象(因為通常是給另外的應用使用的),接收者通過兩步來實現
①在資訊清單檔中進行配置,
②繼承BroadcastReceiver對象,並重寫onReceive方法,在其中實現功能即可。
有序廣播通過指定優先順序來確定接收順序,優先順序從-1000~1000,
①如果同一個應用中的優先順序相同,則在資訊清單檔中前面的先接收
②如果不同應用中的優先順序相同,則先安裝的應用先接收
參考:http://blog.csdn.net/xiazdong/article/details/7768807,
http://www.runoob.com/w3cnote/android-tutorial-broadcastreceiver.html
android學習筆記五。2、其他組件