只要我在Hangouts 2.0中禁用“开启SMS”,我的应用程序就能够再次接收SMS_RECEIVED意图。
广播接收器在清单文件中注册如下:
AndroidManifest.xml
…
<receiver android:name=".SMSReceiver" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
…
SMSReceiver.java
public class SMSReceiver extends BroadcastReceiver {
private static final Log LOG = Log.getLog();
@Override
public void onReceive(Context context, Intent intent) {
LOG.d("onReceive");
…
}
}
我已经尝试将接收器的优先级更改为INT_MAX或999,这是意图过滤器文档中最高可能的优先级, 但没有成功。我知道SMS_RECEIVED
意图是有序发送的,并且高优先级应用程序有能力中止广播。1 但似乎不太可能Hangouts 2.0正在使用高优先级注册SMS_RECEIVED
接收器并调用abortBroadcast()
,从而防止其他任何应用程序接收意图。
让我更加困惑的是,即使使用Hangouts 2.0作为默认短信应用程序,我的Pebble仍然能够接收短信。我想知道Pebble有什么不同之处? 我刚刚注意到,我的Pebble上收到的短信通知不再是由Pebble应用程序接收的新短信通知,而是由Hangouts接收传入短信引起的“新Hangout消息”通知。因此,Pebble应用程序也无法使用SMS_RECEIVED
接收传入的文本消息。
顺便提一下,这与此问题并不相关,因为我仍在使用Android 4.3(但我的应用程序针对SDK级别19,即Android 4.4,如果有关系的话),Google的Android开发者博客关于Kitkat中新的SMS API的文章说,对于仅使用SMS_RECEIVED并且不尝试将短信写入SMS提供程序的应用程序,不会有任何变化。
1我一直认为SMS_RECEIVED广播是可以被取消的。但Android 4.4 APIs site上说了不同的话:"...通过监听SMS_RECEIVED_ACTION广播来接收新短信,这是一个不可取消的广播..."
abortBroadcast()
无法起作用,因为在Hangout接收广播意图之前,你没有办法接收到广播意图。 - Flow