android - 在 Oreo 及其他地方观察 SMS 内容提供商
问题描述
Objective观察 SMS Content Provider 以跟踪 Sent SMS 并在达到一定限制时通知用户。
什么有效:
- 针对 API 22,我启动了一个 (
START_STICKY
) 后台服务,该服务初始化了一个 ContentObserver,它监听 SMS URI 的变化。 - 由于 Oreo 不允许后台服务,我将其更改为 foregroundService,它显示服务正在运行但按预期工作的持久通知。(运行正常的后台服务,当父活动空闲大约 1 分钟后它会停止)
在奥利奥上跑步
在阅读许多文章时,我可以找到JobIntentService
可以在后台执行任务然后完成的东西。由于我需要 ContentObserver 始终或至少在设备被唤醒时运行,是否有任何首选方法来完成此操作。
持续通知甚至让我停止服务,因为它看起来很烦人。
参考
解决方案
在 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
推荐阅读
- dart - Dart sass 的 Bootstrap 5 sass
- python - 你如何创建一个随机的整数列表,但排除某个数字?
- c++ - 为什么我的某些系统上的 libcurl 多接口速度异常缓慢?
- pdf - 使用 PDFBox 检测大型 PDF 文档中的彩色或删除线文本
- c# - 如何使用 Selenium Webdriver 和 C# 保存图像?
- javascript - 单击购物车图标时如何插入购物车滑动切换选项?
- mysql - 基于聚合列的具有汇总和排序的 MySQL groupby
- bash - 为什么 ERR 无法访问全局变量
- python - 关于使用 matplotlib 将条形标签添加到分组条形图的问题
- php - Doctrine 2 - MySql:向每个视图添加多个“BASE TABLE”查询