Go SMS Pro覆盖android.provider.Telephony.SMS_RECEIVED

时间:2013-06-30 18:10:31

标签: android sms broadcastreceiver

我有一个应用程序,允许用户在收到短信时转发。回到当天,我android:priority intent-filter android.provider.Telephony.SMS_RECEIVED的{​​{1}}设置为几乎不超过Android的默认消息应用程序。我这样做了,因此用户可以转发消息,而无需在消息传递应用程序中清除它们。然而,几个月后,Go SMS Pro发布了他们的应用程序更新,其android:priority值非常高,因此安装该应用程序的用户开始出现问题。我更新了我的应用程序,以便我的优先级略高于Go SMS Pro,一切都很顺利。现在Go SMS Pro再次执行此操作,他们的android:priority已被占用到您可以分配的最大值。 2147483647在他们的一个广播接收器上,2147483640在另一个上(是的,Go SMS Pro现在有两个广播接收器)。

为了解决这个问题,我尝试将我的优先级更改为max,就像他们一样,但不知怎的,即使我们的优先级相同,他们的应用也一直在赢取短信。我在Android的某个地方读到必须在具有相同优先级的两个应用程序之间做出决定时,它会选择最早安装的应用程序。我尝试在我的应用程序之后安装Go SMS Pro,但仍然没有。

解决这个问题的正确方法是什么?他们在他们的应用程序中做了什么,使他们在其他人之前获得SMS广播,即使具有相同的android:priority值?

2 个答案:

答案 0 :(得分:4)

  

解决这个问题的正确方法是什么?

修改您的应用程序,以便在Go SMS Pro或任何其他应用程序之后运行。如果您检测到具有相同或更高优先级的同一广播的应用程序(对此使用PackageManager),您也可以建议用户,以便他们知道相应地配置这些应用程序。

试图比其他人拥有更高的优先级是一场军备竞赛,在这场竞赛中,你最终会最终结束同样的优先级。具有绑定优先级的有序广播的行为没有记录,因此没有保证的行为。 Android(或Android的定制版本)欢迎修改tie-breaker算法。该算法可以是:

  • 按包名称的字母顺序

  • 在散列集合中找到的顺序,其中散列键可以基于任何东西(例如,对象ID)

  • 随机数生成器

由于您无法可靠地“赢”,因此当您确实“失败”时,请尽可能修改您的应用。

答案 1 :(得分:2)

go sms pro已将这些行设置在SmsReceiver的清单中:

<receiver android:name=".smspopup.SmsReceiver"     android:permission="android.permission.BROADCAST_SMS">
        <intent-filter android:priority="2147483647">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter android:priority="2147483647">
            <action android:name="android.provider.Telephony.GSM_SMS_RECEIVED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
            <data android:mimeType="application/vnd.wap.mms-message" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.android.mms.transaction.MESSAGE_SENT" />
        </intent-filter>
    </receiver>

所有这些意图过滤器的优先级都高于接收者,即使您的接收者的优先级设置为2147483647.您可以通过以下方式查看所有应用程序的所有接收者列表:

List<ResolveInfo> receivers = getPackageManager().queryBroadcastReceivers(new Intent("android.provider.Telephony.SMS_RECEIVED"), 0);

列表中的第一个接收者,比其他人接收短信