天天看點

android 監聽圖庫變化,Android ContentObserver 監聽圖庫變化

電腦環境是XP,軟體是gVim7.3,安裝在C槽的 Program Files 下。如何設定gVim的字型和背景顔色:C---Program Files---Vim---_vimrc檔案,用文本編輯器打開此檔案

Android ContentObserver 監聽圖庫變化

分類:

Android記事

相比FileObserver的繁瑣,ContentObserver在易用性上還是要優秀一些的,是以我們可以在有監聽需求的時候選用一下,一個功能多一種實作方式,就多了一個比較嘛。

關于ContentObserver

ContentObserver顧名思義,就是内容觀察器的意思,跟FileObserver很像,隻不過前者是監聽資料庫的變化。

實作步驟

這裡我們就拿圖庫監聽做一個例子:

在做之前先給出圖庫相對的資料庫的Uri:

MediaStore.Images.Media.EXTERNAL_CONTENT_URI

這個Uri很關鍵,它指向我們需要監聽的圖檔庫的資料庫,還有很多Uri,有興趣的可以去查一下,這裡就不做延伸了。

1.實作自己的内容觀察器

跟FileObserver一樣,ContentObserver也是一個抽象類,需要我們來繼承實作是以第一步就是實作自己的内容檢視器:

public class ScreenshotContentObserver extends ContentObserver {

private Context mContext;

private Handler mHandler;

public ScreenshotContentObsetver(Context context, Handler handler) {

super(handler);

mContext = context;

mHandler = handler; //最好将主線程的handler傳遞過來,這樣友善通信和更新UI

}

@Override

public void onChange(boolean selfChange) {

super.onChange(selfChange);

Log.i(MainActivity.TAG, "database is changed!------------------------------------------");

Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

Cursor cursor = mContext.getContentResolver().query(uri, null, null, null, "_data desc");

if (cursor != null) {

Log.i(MainActivity.TAG, "The number of data is:" + cursor.getCount());

StringBuffer sb = new StringBuffer();

while (cursor.moveToNext()) {

String fileName = cursor.getString(cursor.getColumnIndex("_data"));

String[] a = fileName.split("/");

Log.i(MainActivity.TAG, a[a.length - 2] + a[a.length - 1]); //觀察輸出地目錄名/檔案名

sb.append("目錄名稱:" + a[a.length -2]);

}

cursor.close();

mHandler.obtainMessage(0x110, sb.toString()).sendToTarget();

}

}

比較奇怪的是onChang方法都會響應兩次,,如果有特殊需求的話可以做一下特殊處理。

2.在activity中調用

private ScreenshotContentObserver mScreenObserver;

private Handler mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

if (msg.what == 0x110) {

Log.i(TAG, "message is back! " + msg.obj.toString());

}

}

};

private void listenDB() {

mScreenObserver = new ScreenshotContentObserver(MainActivity.this, mHandler);

registerContentObserver();

}

private void registerContentObserver() {

Uri imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

getContentResolver().registerContentObserver(imageUri, false, mScreenObserver);

Log.i(TAG, "registered!---------------------------");

}

隻需要再activity中調用listenDB就可以了。

3.權限聲明

最後在清單檔案中加入下面的權限

需要注意的是,根據你監聽的Uri不同可能會需要特殊的權限,比如監聽聯系人,就需要聯系人檢視權限,這個需要自己去注意一下。

總結

相對于FileObserver的各種暗坑,ContentObserver還是很好用的,響應速度上應該是前者更快一點,因為畢竟是直接監聽的檔案目錄。這個等以後有時間我可以探究一下兩者之間的效率對比。

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

上一篇android FileObserver的用法與避坑指南

下一篇文章标題