首页 > 解决方案 > 在 Oreo 及其他地方观察 SMS 内容提供商

问题描述

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

什么有效:

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

在奥利奥上跑步

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

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

参考

标签: androidandroid-serviceandroid-contentprovider

解决方案


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

下面的博客文章中记录了此示例代码和实现它的方法。

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


推荐阅读