观察 Oreo 及以后的 SMS Content Provider
Observe SMS Content Provider in Oreo and beyond
Objective观察SMS Content Provider跟踪发送的SMS并在达到一定限制时通知用户。
什么有效:
- 针对 API 22,我启动了一个 (
START_STICKY
) 后台服务,该服务初始化了一个侦听 SMS URI 更改的 ContentObserver。
- 由于 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
Objective观察SMS Content Provider跟踪发送的SMS并在达到一定限制时通知用户。
什么有效:
- 针对 API 22,我启动了一个 (
START_STICKY
) 后台服务,该服务初始化了一个侦听 SMS URI 更改的 ContentObserver。 - 由于 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