观察 Oreo 及以后的 SMS Content Provider

Observe SMS Content Provider in Oreo and beyond

Objective观察SMS Content Provider跟踪发送的SMS并在达到一定限制时通知用户。

什么有效:

  1. 针对 API 22,我启动了一个 (START_STICKY) 后台服务,该服务初始化了一个侦听 SMS URI 更改的 ContentObserver。
  2. 由于 Oreo 不允许后台服务,我将其更改为 foregroundService,它显示一个持续通知,表明服务正在 运行ning 但按预期工作。 (运行 一个正常的后台服务,当父 activity 空闲时,它会在大约 1 分钟后停止)

运行 奥利奥

在阅读许多文章时,我可以找到像 JobIntentService 这样的东西,它可以在后台执行任务然后完成。由于我需要 ContentObserver 运行 始终或至少在设备被唤醒时,是否有任何首选方法来完成此操作。

持续不断的通知甚至让我停止服务,因为它看起来很烦人。

参考资料

在 Android 7+ 上,我们可以使用 JobScheduler 和 addTriggerContentUri() 来解决这个问题及其工作。

下面的博客 post.

中记录了此示例代码和实现它的方法

http://midhunhk.github.io/dev/2018/08/05/content-observer-service/

创建一个工作服务

class MyJobService : JobService() {  
 override fun onStartJob(params: JobParameters?): Boolean {  

    doAsync{
      // Do your content observer changes here

      jobFinished(params, true)
    }

    return true
}

override fun onStopJob(params: JobParameters?): Boolean {
    return false
}  

}

正在安排 JobService

val component = ComponentName(context, MyJobService::class.java)
        val contentUri = JobInfo.TriggerContentUri(Uri.parse("content://sms"),
                JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)

        val jobInfo = JobInfo.Builder(JOB_ID, component)
                .addTriggerContentUri(contentUri)
                .setTriggerContentUpdateDelay(DELAY_MIN)
                .setTriggerContentMaxDelay(DELAY_MAX)
                .build()

        // Schedule a Job if not already done so
        val scheduler: JobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler

        val result = scheduler.schedule(jobInfo)
        return (result == JobScheduler.RESULT_SUCCESS)
    }

更多阅读:https://medium.com/google-developers/scheduling-jobs-like-a-pro-with-jobscheduler-286ef8510129