電腦環境是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的用法與避坑指南
下一篇文章标題
頂
踩