我有以下问题:
接收BroadcastReceiver时是否可以完全覆盖电话功能?例如,是否可以接收短信并且不让短信出现在通知区域中?
谢谢
答案 0 :(得分:0)
是的,可以像下面的代码一样定义你的BR。确保你从接收方调用abortBroadcast();
方法,这样它就不会再允许进一步调用其他BR的接收。
<receiver android:name=".SMSReceiver"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
权限
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
但是它不会保证一直都能正常工作,因为可能有其他应用程序正在做同样的事情并且可能已经abortedBroadcast,所以甚至你的onReceive也可能不会被tringger。
答案 1 :(得分:0)
有时。这取决于它是什么类型的广播。看看docs for BroadcastReceiver
:
可以收到两类主要的广播:
- 正常广播(使用Context.sendBroadcast发送)是完全异步的。广播的所有接收者通常在同一时间以不确定的顺序运行。这样效率更高,但意味着接收者无法使用结果或中止此处包含的API。
- 有序广播(使用Context.sendOrderedBroadcast发送)一次传送到一个接收器。当每个接收器依次执行时,它可以将结果传播到下一个接收器,或者它可以完全中止广播,以便它不会传递给其他接收器。可以使用匹配的intent-filter的android:priority属性来控制运行的订单接收器;具有相同优先级的接收器将以任意顺序运行。
SMS恰好是有序广播,因此在这种情况下,如果您拨打abortBroadcast
,则不会调用priority较低的其他接收器。这只有在你的优先级最高时才有效,但实际上并不能保证,但你可以通过设置一个非常高的优先级来做一个合理的工作,也许over 9000可能是合适的。虽然docs确实说不使用1000或更多,但这是为了确保系统始终能够处理广播。但在你的情况下,你确实想要阻止系统处理广播。