2017-07-12 61 views
1

我有一个Android应用程序,我想监视一个文件夹。我提供了一项服务(即使用户杀死应用程序,我也要不停地监视文件夹),并将文件夹的路径放在Intent的附加内容中。在服务中,我有一个FileObserver应该监视我的文件夹,并在文件夹内创建文件时触发事件。问题是事件从未被触发。 我做错了什么?谢谢!监控Android服务中的文件夹

@Override 
public int onStartCommand(Intent intent, int flags, int startId){ 

    String mainFolder = intent.getStringExtra("mainFolder"); 

    Toast.makeText(getApplicationContext(), "Service start! Main folder is: " + mainFolder, Toast.LENGTH_LONG).show(); 

    FileObserver observer = new FileObserver(mainFolder) { 
      @Override 
      public void onEvent(int event, String path) { 
       if (path == null) { 
        return; 
       } 
       if (FileObserver.CREATE == event) { 
        Toast.makeText(getApplicationContext(), "This file was creted: " + path, Toast.LENGTH_LONG).show(); 

       } 
      } 
     }; 

    observer.startWatching(); 

    return START_REDELIVER_INTENT; 
} 

回答

0

报价the documentation for FileObserver

警告:如果FileObserver是垃圾回收,它会停止发送事件。为确保您继续接收事件,您必须保留对某个其他活动对象的FileObserver实例的引用。

FileObserver实例是符合垃圾收集尽快onStartCommand()的回报,因为你不把它保持在外地,但在本地变量。

另外,请记住,服务不会永远运行。

+0

谢谢你的回答!我知道一个服务不会永远运行,但是“return START_REDELIVER_INTENT;”声明应该重新打开该服务。 –

+0

@AlexHash:是的,但由于您的服务不是前台服务,所以在Android 8.0+上,它会运行一分钟左右,然后停止。 – CommonsWare