5

我有一个应用程序,允许用户在收到短信时转发短信。过去android:priority,我intent-filter的 forandroid.provider.Telephony.SMS_RECEIVED 设置仅略高于 Android 的默认消息传递应用程序。我这样做是为了让用户可以转发消息,而无需在消息应用程序中清除它们。然而,几个月后,Go SMS Pro 发布了一个android:priority价值极高的应用程序更新,因此安装该应用程序的用户开始遇到问题。我更新了我的应用程序,使我的优先级略高于 Go SMS Pro,一切顺利。现在 Go SMS Pro 又做了一次,它们android:priority已经达到了您可以分配的最大值。2147483647 在他们的一个广播接收器上,2147483640 在另一个广播接收器上(是的,Go SMS Pro 现在有两个广播接收器)。

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

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

4

2 回答 2

4

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

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

试图比其他人拥有更高的优先级是一场军备竞赛,在这场竞赛中,你最终会结束,充其量,与相同的优先级并列。具有绑定优先级的有序广播的行为没有记录,因此没有保证行为。欢迎 Android(或 Android 的定制版本)修改决胜局算法。该算法可能来自:

  • 按包名字母顺序

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

  • 随机数发生器

由于您无法可靠地“赢”,因此当您确实“输”时,请修改您的应用程序以使其尽可能成功。

于 2013-06-30T18:16:55.703 回答
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);

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

于 2013-11-22T10:49:30.060 回答