Android檔案或資料夾內容改變監聽器(FileObserver)

鴨脖發表於2015-03-25

一. 概述:

 

     android.os包下的FileObserver類是一個用於監聽檔案訪問、建立、修改、刪除、移動等操作的監聽器,基於linux的INotify。

 

     FileObserver是個抽象類,必須繼承它才能使用。每個FileObserver物件監聽一個單獨的檔案或者資料夾,如果監視的是一個

 

     資料夾,那麼資料夾下所有的檔案和級聯子目錄的改變都會觸發監聽的事件。

 

二. 監聽的事件型別:

 

     (1)ACCESS,即檔案被訪問。

 

     (2)MODIFY,檔案被修改。

 

     (3)ATTRIB,檔案屬性被修改,如 chmod、chown、touch 等。

 

     (4)CLOSE_WRITE,可寫檔案被 close。

 

     (5)CLOSE_NOWRITE,不可寫檔案被 close。

 

     (6)OPEN,檔案被 open。

 

     (7)MOVED_FROM,檔案被移走,如 mv。

 

     (8)MOVED_TO,檔案被移來,如 mv、cp。

 

     (9)CREATE,建立新檔案。

 

     (10)DELETE,檔案被刪除,如 rm。

 

     (11)DELETE_SELF,自刪除,即一個可執行檔案在執行時刪除自己。

 

     (12)MOVE_SELF,自移動,即一個可執行檔案在執行時移動自己。

 

     (13)CLOSE,檔案被關閉,等同於(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)。

 

     (14)ALL_EVENTS,包括上面的所有事件。

 

               注:上面的所有靜態變數都是FileObserver靜態屬性。

 

三. 例:

 

    (1)建立目錄監聽器: 

[java] view plaincopy
  1. import android.os.FileObserver;     
  2. import android.util.Log;     
  3.     
  4. /**   
  5.  * SD卡中的目錄建立監聽器。   
  6.  *  
  7.  * @author mayingcai 
  8.  */    
  9. public class SDCardListener extends FileObserver {     
  10.    
  11.        public SDCardListener(String path) {   
  12.               /*   
  13.                * 這種構造方法是預設監聽所有事件的,如果使用 super(String,int)這種構造方法,   
  14.                * 則int引數是要監聽的事件型別.   
  15.                */    
  16.               super(path);     
  17.        }     
  18.      
  19.        @Override    
  20.        public void onEvent(int event, String path) {            
  21.               switch(event) {     
  22.                      case FileObserver.ALL_EVENTS:     
  23.                             Log.d("all""path:"+ path);     
  24.                             break;     
  25.                      case FileObserver.CREATE:     
  26.                             Log.d("Create""path:"+ path);     
  27.                             break;     
  28.               }     
  29.       }     
  30. }  

 

     (2)給目錄設定監聽器:

 

[java] view plaincopy
  1. SDCardListener listener = new SDCardListener("目錄");     
  2.   
  3. //開始監聽     
  4. listener.startWatching();  
  5.      
  6. /*   
  7.  * 在這裡做一些操作,比如建立目錄什麼的   
  8.  */    
  9.   
  10. //停止監聽     
  11. listener.stopWatching();    

 

四. 注意事項:

 

     FileObserver物件必須保持一個引用,確保不被垃圾收集器回收掉,否則就不會觸發事件,這裡可以考慮使用Service服務。

相關文章