0

我有以下问题:

接收广播接收器时是否可以完全覆盖电话功能?例如,是否可以接收短信并且不让短信出现在通知区域中?

谢谢

4

2 回答 2

0

有时。这取决于它是什么类型的广播。查看文档BroadcastReceiver

可以接收到两大类广播:

  • 普通广播(使用 Context.sendBroadcast 发送)是完全异步的。广播的所有接收器都以未定义的顺序运行,通常同时运行。这更有效,但意味着接收者不能使用结果或中止此处包含的 API。
  • 有序广播(使用 Context.sendOrderedBroadcast 发送)一次交付给一个接收器。当每个接收器依次执行时,它可以将结果传播给下一个接收器,或者它可以完全中止广播,这样它就不会被传递给其他接收器。运行的订单接收器可以通过匹配intent-filter的android:priority属性来控制;具有相同优先级的接收器将以任意顺序运行。

SMS 恰好是一个有序广播,所以这种情况下如果你调用,其他优先级abortBroadcast较低的接收者将不会被调用。这仅在您的优先级最高时才有效,这实际上无法保证,但您可以通过设置非常高的优先级来完成合理的工作,也许超过 9000可能是合适的。尽管文档确实说不要使用 1000 或以上的任何东西,但这是为了确保系统始终能够处理广播。但是,在您的情况下,您确实确实希望阻止系统处理广播。

于 2013-02-13T20:51:59.323 回答
0

是的,可以像下面的代码一样定义您的 BR。确保abortBroadcast();从接收器调用方法,这样它就不会允许进一步调用其他 BR 的 onReceives。

<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> 

但它不能保证一直工作,因为可能有其他应用程序在做同样的事情并且可能已经中止广播,所以即使你的 onReceive 也可能不会触发。

于 2013-02-13T20:33:27.343 回答