Android的內容觀察者 通知 內容提供者

2021-08-11 05:55:23 字數 3571 閱讀 8753

一、內容提供者的作用

1. 應用成需建立的資料庫檔案,預設都是私有的,其他應用程式不具備讀寫許可權

2. 如果真的想把自己的資料庫資料暴露給其他程式訪問,那麼就應該通過內容提供者來暴露。

3. 與aidl有點類似,但不太一樣,aidl是提供記憶體中的資料給其他應用訪問,內容提供者是提供磁碟中的資料給其他應用訪問。

二、使用內容提供者的步驟

1. 自定義乙個類,繼承contentprovider

public class backdoor extends contentprovider {}
2. 註冊,要新增主機名

3. 定義乙個uri匹配器

/**

* 由於應用程式一安裝,就會把程式中的內容提供者口令發布出來,為了提高資料的安全性, 所以必須對來訪的uri(口令),做一些匹配規則過濾一下。

*/// 定義乙個uri的匹配器,指定裡面如果傳遞過來的uri,一旦沒有匹配,將返回的int值 -1

static urimatcher matcher = new urimatcher(urimatcher.no_match);

4. 預設一些匹配規則

static
5. 編寫crud方法

@override

public int delete(uri uri, string selection, string selectionargs) else

return 0;

}

6. 在其他應用操作內容提供者

public void insert(view v)

三、學習內容提供者的目的

1. 一般在開發當中都不會把自己的資料暴露出來,也就是編寫自定義的內容提供者的機率非常之小。

2. 去訪問系統應用暴露出來的資料,如:備份來聯絡人和備份簡訊

四、新增和刪除簡訊

* 新增簡訊

//新增簡訊

public void insert(view v)

* 刪除簡訊

//刪除簡訊

public void delete(view v) );

toast.maketext(this, "刪除短息成功", 0).show();

}

五、介面提醒

1. toast

2. dialog-對話方塊

3. notification -- 通知

> 通知是執行在另外乙個程序中 , systemui

//傳送通知

public void send(view v)

六、聯絡人的內容提供者

6.1 查詢聯絡人

> 1. 查詢raw_contacts表,得到contact_id

> 2. 根據contact_id,去查詢 data1, mimetype型別

6.2 刪除聯絡人

> 刪除聯絡人後,發現並不是真的從資料庫中把這條記錄給移除,而是把contact_id置為null而已,

android之所以這麼做,是為了日後聯網同步所考慮的。

6.3 新增聯絡人

> 先查詢raw_contacts表,獲取到當前的最新_id

//新增一條聯絡人記錄

contentresolver resolver = getcontentresolver();

//2定義查詢raw_contact表的uri

uri contacturi = uri.parse("content:");

//查詢data表的uri

uri datauri = uri.parse("content:");****

//由於不知道當前的contact_id已經走到了多少,所以不能盲目直接編寫,應該去查詢

//該表中的_id列,然後倒序排列,取第一條就可以了。

cursor cursor = resolver.query(contacturi, new string, null, null, "_id desc");

cursor.movetofirst();

int id = cursor.getint(0)+1; //在原來的id基礎上+1 ,形成了現在新新增的id

> 在它基礎上+1 ,得到現在要往資料庫新增的新raw_contact_id

contentvalues values = new contentvalues();

values.put("contact_id", id);

resolver.insert(contacturi, values);

> 最後往data表裡面新增 姓名、**、郵箱...

//往data表裡面新增資料

//新增姓名

contentvalues nameval = new contentvalues();

nameval.put("data1", et_name.gettext().tostring()); //新增姓名

nameval.put("raw_contact_id", id); //新增這個資料屬於誰的uri

nameval.put("mimetype", "vnd.android.cursor.item/name"); //指定新增的資料屬於什麼型別

resolver.insert(datauri, nameval);//插入記錄

七、內容觀察者

> 內容觀察者實際上就是當資料的資料發生了改變之後,發布出來乙個通知,如果有哪乙個內容觀察者

> 在觀察這個uri對應的路徑,那麼就會收到這個通知

* 發布通知

// 對外發布乙個通知,告訴其他人,這個uri對應的資料已經發生了改變。如果第二個引數不是null,

//那麼在此指定的這個內容觀察者將會收到這個通知,如果是null,代表的是不會直接報告給某乙個內容觀察者,

//僅僅是發出來乙個通知,如果有關心這個通知,那麼久能知道事件的發生

getcontext().getcontentresolver().notifychange(uri, null);

注意:發布通知這個事件不一定在內容觀察者裡面執行,也可以在資料庫操作完成之後執行。

* 註冊乙個內容觀察者

uri uri = uri.parse("content:");

//註冊乙個內容觀察者,讓他觀察指定的uri, 如果這個uri的資料發生了改變,那麼將會得到通知

getcontentresolver().registercontentobserver(

uri, //觀察指定的uri

true, // 如果是true, 代表只要前面的uri能夠匹配成功,那麼就會收到通知,如果是false代表的時候

//要所有的路徑都完全匹配

new contentobserver(new handler())

});

Android的內容觀察者

有個很常見的需求就是當有新的簡訊來的時候,把內容顯示在介面上。這裡就要用到內容觀察者。就是讓你的程式監視簡訊,如果他內容發生變化的時候,你去獲取。而簡訊那邊做的情況就 是,當他自己的資料變化時,他告訴有個公共簡訊記憶體區,他說,我資料變化了!然後通過簡訊的內容提供者把簡訊的內容拿到公共記憶體區,你的...

內容觀察者

1,註冊內容觀察者 getcontentresolver registercontentobserver uri,true,observer observer 實現contentobserver類的下面方法 override public void onchange boolean selfchan...

內容觀察者

uri uri uri.parse content 其中第二引數時乙個boolean,如果為true,表示uri可以時非完整的路徑,如果是false,就必須要是乙個完整的uri,上面的uri就是非完整的。第三個引數是contentreserver getcontentresolver registe...