【发布时间】:2018-03-12 17:10:24
【问题描述】:
我正在开发一个应用程序,它需要在收到短信时运行一些代码(网络)。
在 API 25 及更低版本中很好,我在 Manifest 文件中注册了一个隐式 receiver 并在扩展 BroadcastReceiver 的指定类中启动我的服务。但是,在 API 26 中,您不能在 receiver 中注册 android.provider.Telephony.SMS_RECEIVED,因为它不起作用。
来自 Android 文档:
注意:如果您的应用以 API 级别 26 或更高级别为目标,则您不能使用清单为隐式广播(不专门针对您的应用的广播)声明接收器,但一些不受该限制的隐式广播除外.在大多数情况下,您可以改用计划作业。
我读过几篇文章,例如this one on medium。有JobScheduler 或Explicit Receiver 之类的解决方案,但是第一个用于更改网络状态,我找不到在SMS_RECEIVED 事件上触发作业的方法,第二个在您的活动结束之前有效启动并运行。
由于我的应用程序的性质,无论应用程序是否正在运行,我都需要监听传入的 SMS。如何在 API 26+ 中做到这一点?
编辑
也许code in JobInfoBuilder doc on android website 会有所帮助。它监控设备上照片的变化并在变化时开始工作。但是我找不到合适的 Uri 对 SMS 做同样的事情(甚至不确定是否可以通过 ContentObserver 监控 SMS)
【问题讨论】:
-
我认为具有定期检查方法的作业调度程序可能是正确的解决方案。
-
@VVB 我正在开发一个 TTS 应用程序,它应该在收到 SMS 时播放声音,但是似乎降低检测收到 SMS 的时间段对性能有不好的影响,而不是一个适当的解决方案。
-
SMS_RECEIVED操作不受新的隐式广播限制的约束。 developer.android.com/guide/components/… -
@MikeM。谢谢。我在这里犯了一个严重的错误,我什至在那个例外列表中搜索了“SMS”。但是,对于那些可以由
setRequiredNetworkTypemethod 直接触发的网络相关接收器以外的非例外接收器,有没有像ContentObserver(不确定)那样做与隐式接收器相同的工作? -
我不确定你在问什么。
setRequiredNetworkType()方法设置必须存在哪个网络才能运行给定的作业。它本身不会触发任何工作。就ContentObservers 而言,如果您在API 级别21+ 上运行,则最好使用JobScheduler。无论哪种情况,SMS 的 URI 都是content://sms,由于某种原因,您无法获得比 SMS Provider 更具体的信息。也就是说,您不能只观察收到的消息content://sms/inbox。
标签: android broadcastreceiver receiver android-jobscheduler