【问题标题】:Monitor a folder in an Android Service监控 Android 服务中的文件夹
【发布时间】:2017-07-12 20:17:06
【问题描述】:

我有一个 Android 应用程序,我想监控一个文件夹。我做了一个服务(我想不停地监控文件夹,即使用户杀死了应用程序),我把文件夹的路径放在 Intent 的附加部分中。在服务中,我有一个 FileObserver,它应该监视我的文件夹并在文件夹内创建文件时触发事件。问题是该事件永远不会被触发。 难道我做错了什么?谢谢!

@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;
}

【问题讨论】:

    标签: android service fileobserver


    【解决方案1】:

    引用the documentation for FileObserver:

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

    onStartCommand() 返回后,您的 FileObserver 实例就有资格进行垃圾回收,因为您不是将它保存在字段中,而是保存在局部变量中。

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

    【讨论】:

    • 感谢您的回答!我了解服务不会永远运行,而是“返回 START_REDELIVER_INTENT;”声明应该重新打开服务。
    • @AlexHash:是的,但是由于您的服务不是前台服务,在Android 8.0+ 上,它会运行一分钟左右,然后停止。