【问题标题】:Android: FileObserver isn't notified about FS changesAndroid:FileObserver 不会收到有关 FS 更改的通知
【发布时间】:2012-11-22 23:48:11
【问题描述】:

我需要在手机启动后一直跟踪从整个文件系统中删除的图像和视频(即使我的 UI 应用程序没有运行),直到手机关闭。为此,我正在使用服务和 FileObserver。不幸的是,下面附加的代码不起作用(我没有使用调试器来访问该方法

public void onEvent(int event, String file)

虽然我对 FS 做了一些更改...服务启动并且显然 onStarted() 方法被执行...

请帮忙

public class DataChangeListener extends Service {

    private static Context context;

    @Override
    public IBinder onBind(Intent intent) {
        context = this;
        return null;
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        context = this;

        FileObserver observer = new FileObserver("/") {

            @Override
            public void onEvent(int event, String file) {
                System.out.println();
            }
        };
        observer.startWatching();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }
}

【问题讨论】:

    标签: java android service fileobserver


    【解决方案1】:

    我需要一直跟踪从整个文件系统中删除的图像和视频

    除非您创建操作系统的修改版本,否则这是不可能的,因为您将无法让服务始终运行。例如,用户可以随时摆脱您的服务。

    很遗憾,下面附加的代码不起作用

    首先,您对/ 没有读取权限,这可能会干扰FileObserver 的操作。

    其次,您错过了突出显示的段落in the FileObserver documentation

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

    您允许对 FileObserver 进行垃圾收集。

    【讨论】:

    • 可以通过 onStartCommand() 返回 START_STICKY 来使服务始终处于活动状态。在这种情况下,即使我在 DDMS 中将其杀死,系统也会立即重新启动它。如果用户明确停止服务,那就是另一回事了。我认为这里的问题是缺少权限。
    最近更新 更多