计划作业以进行文件更改通知

时间:2019-09-17 09:41:56

标签: android android-jobscheduler android-background

我想在特定文件更改时收到通知。我一直在研究FileObserver,但是在阅读了this thread的答案后,我尝试使用JobScheduler完成目标,当文件更改时,应该使用{{ 3}}。

我首先从文档页面复制示例,将应触发作业的Uri更改为Uri.fromFile(File(<path-to-file>))。不幸的是,尽管onStartJob()返回成功,但从未调用过我的JobScheduler::schedule()方法。

现在,我想知道我做错了什么还是我的解释中存在一般性缺陷,也许就不可能在普通文件更改上触发工作吗?

我的类/代码的精简版看起来像这样(科特琳):

class FilechangeService : JobService() {

    companion object {

        private const val JOB_ID = 0

        // Schedule this job, replace any existing one.
        fun scheduleJob(context: Context) {

            // JobInfo Builder to construct the Job
            val builder = JobInfo.Builder(
                JOB_ID,
                ComponentName(context, FilechangeService::class.java)
            )
            // Look for changes to specific file
            val uri = Uri.fromFile(File(<path-to-file>))
            builder.addTriggerContentUri(
                JobInfo.TriggerContentUri(uri, 0)
            )
            val jobInfo = builder.build()
            val js = context.getSystemService(JobScheduler::class.java)
            val status = js.schedule(jobInfo)
        }
    }

    override fun onStartJob(params : JobParameters) : Boolean {
        // Code that is never executed =(
        return false
    }
}

当然,FilechangeService::scheduleJob()是从应用程序的另一部分调用的。此外,我已经使用android:permission="android.permission.BIND_JOB_SERVICE"将服务添加到了AndroidManifest.xml中。

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

总结一下评论中所说的话,似乎不可能做到我试图实现的目标。这是因为/** @file app.component.ts */ @Component({ /* ... */ }) export class AppComponent { public test$: Observable<any[]>; constructor(service: Service) { this.test$ = this.service.getEntityDetails(); } } 必须是“内容Uri”,因此“文件Uri”似乎无效。