自 android 8 以来,操作系统对应用程序如何以及何时使用广播接收器和服务设置了可能的限制。
TL;DR:启动 Android 8,操作系统将停止您的服务和广播接收器,上述文档中提到的某些情况除外。
那么检测传入短信的正确方法是什么?我们可以使用 WorkManager 手动查询 SMS,每 15 分钟检查一次新条目。但是有什么方法可以立即获得它呢?
官方文档还在
广播列表中列出了
SMS_RECEIVE
意图,这些广播是上述规则的例外,但许多人发现接收器和服务仍然被终止,我已经通过自己的测试确认了这一点。
有一些支出跟踪应用程序,无论情况如何,仍然会跟踪传入的短信。
非常感谢有关情况的任何意见。
谢谢。
可能现在回答OP已经太晚了,但万一其他人像我一样登陆这里,结果你现在可以使用
WorkManager
来获取新短信通知。你会做这样的事情,
class ProcessNewSmsWorker(
appContext: Context,
params: WorkerParameters
) : CoroutineWorker(appContext, params) {
private lateinit var workManager: WorkManager
override suspend fun doWork(): Result {
// Get SMS from ContentResolver and process them as needed
// Enqueue again to process new changes in Sms.Sms.CONTENT_URI since last SMS DB read
doEnqueueWorkerToUploadNewMessages(workManager)
return Result.success()
}
companion object {
val TAG: String = ProcessNewSmsWorker::class.java.simpleName
private val constraints: Constraints by lazy {
Constraints.Builder()
.addContentUriTrigger(Sms.CONTENT_URI, true)
.setTriggerContentMaxDelay(3, TimeUnit.SECONDS)
.setTriggerContentUpdateDelay(3, TimeUnit.SECONDS)
.build()
}
fun doEnqueueWorkerToUploadNewMessages(workManager: WorkManager) {
workManager.enqueueUniqueWork(
TAG,
// NOTE: APPEND isn't triggering the worker at all
ExistingWorkPolicy.APPEND_OR_REPLACE,
OneTimeWorkRequestBuilder<ProcessNewSmsWorker>()
.addTag(TAG)
.setConstraints(constraints)
.build()
)
}
}
}
您可以从应用程序类中调用 fun
doEnqueueWorkerToUploadNewMessages()
,以在应用程序启动时将此工作人员排入队列
希望这有帮助!