给出基本的步骤如下:

private static void init(){

// 2.icon目录
ICON_PATH = AccountOperation.defaultCache + "icon/";

if(!iconFile.exists()){
iconFile.mkdirs();
}
mObservers.add(new IconFileObserver());  // 管理多个监听目录
}/**
 
 * 开始监听
 *
 */

 
public static void startWatching(){
//初始化
init();
Log.w(TAG, "startWatching()");

fo.startWatching();
}
    /**
 
 * 结束监听 
 *
 */

   public static void stopWatching(){
Log.w(TAG, "stopWatching()");
fo.stopWatching(); 
mObservers.clear();
}/**
 
* 监听目录 
*
*/
static class IconFileObserver extends FileObserver{
public IconFileObserver(){
super(ICON_PATH, FileObserver.ALL_EVENTS);
}


@Override 
public void onEvent(int event, String path){
switch (event){
case FileObserver.ACCESS:
//Log.i("RecursiveFileObserver_IconFileObserver", "ACCESS: " + path);
break;
case FileObserver.ATTRIB:
//Log.i("RecursiveFileObserver_IconFileObserver", "ATTRIB: " + path);
break;
case FileObserver.CLOSE_NOWRITE:
//Log.i("RecursiveFileObserver_IconFileObserver", "CLOSE_NOWRITE: " + path);
break;
case FileObserver.CLOSE_WRITE:
//Log.i("RecursiveFileObserver_IconFileObserver", "CLOSE_WRITE: " + path);
break;
case FileObserver.CREATE:
//Log.i("RecursiveFileObserver_IconFileObserver", "CREATE: " + path);
break;
case FileObserver.DELETE:
Log.i("RecursiveFileObserver_IconFileObserver", "DELETE: " + path);
break;
case FileObserver.DELETE_SELF:
//Log.e("RecursiveFileObserver_IconFileObserver", "DELETE_SELF: " + path);
break;
case FileObserver.MODIFY:
//Log.i("RecursiveFileObserver_IconFileObserver", "MODIFY: " + path);
break;
case FileObserver.MOVE_SELF:
//Log.i("RecursiveFileObserver_IconFileObserver", "MOVE_SELF: " + path);
break;
case FileObserver.MOVED_FROM:
//Log.i("RecursiveFileObserver_IconFileObserver", "MOVED_FROM: " + path);
break;
case FileObserver.MOVED_TO:
//Log.i("RecursiveFileObserver_IconFileObserver", "MOVED_TO: " + path);
break;
case FileObserver.OPEN:
//Log.i("RecursiveFileObserver_IconFileObserver", "OPEN: " + path);
break;
default:
//Log.i("RecursiveFileObserver_IconFileObserver", "DEFAULT(" + event + "): " + path);
break;
}
}
 
}


二、下面总结各个事件触发的机制。


1, Open事件比较普遍在创建和读写文件时会触发。

2, Modify事件在文件被编辑时会被触发,在文件复制时也会被触发。

3, CloseWrite事件就是在文件编辑或者是在复制结束时触发。

4, MoveTo事件在文件剪切和重命名时被触发。

5,MoveFrom事件当把文件进行重命名时触发。

6, Delete事件就是文件被删除时触发,比较好理解。

三、Android中office软件可谓变化多端,但是无论怎么变都只有两种模式,一个是对文件的修改时源文件本身进行修改的,一个是在临时文件上进行修改,在编辑结束后覆盖源文件,从而达到文件的修改。

这两种模式促发的文件变化监听结果是如下:

第一种情况, Open->Modify->closeWrite

第二种情况,Open->Delete->MoveTO


上面只是基本的路线,我们在实际中还要注意我们如何区分这个事件流是有第三方程式触发的还是由于我们在ES文件浏览器上操作导致的,我们必须得注意。

  同时还要注意我们程式自身一些操作会导致文件变动的因素,因此都要进行区分。(这点是很重要的实际开发中这类的问题会变得更加的复杂,需根据你的具体需求来进行设计, 如果你可以得到底层api方法的实现源码并理解,这是最好的你可以自己定制你想要的模式而不与其他冲突。  7-19-12  有被问到实际应用的问题做这块说明,希望今后开发用得上。)


四、知道上面这些有什么用呢?

      在Android中如果你想用第三方程式去编辑你的文档并且希望根据文件的变化通知你开发程式做出相应的变化,那么你就要好好的摸清楚上面的事件触发机制了,比如说Android的文件同步管理就要用到这个。

    在android上有很多的第三方程式可以打开文档并且可以编辑他们,若我们想在第三方程式编辑完文档后做一些处理,那么必须面对一个现实那就是每个第三方程式实现文档打开和编辑都是有自己的特性的,像Office软件一样编辑时有的会生成临时文件,有的是在源文件上编辑,而生成临时文件的第三方程式,他们的临时文件又会出现各式各样的特性,那么用户在调用迪桑方程式后怎么通知你的同步管理模块呢?这个时候必须要进行监听,而监听就必须总结FileObserver的规则,同时了解每个第三方程式的特性,方可以完成同步管理时针对文件变化进行改变状态或者作出相应的操作。