Java Facebook';s";信使;具有在重新启动后具有最高优先级的SMS广播接收器

Java Facebook';s";信使;具有在重新启动后具有最高优先级的SMS广播接收器,java,android,facebook,broadcastreceiver,Java,Android,Facebook,Broadcastreceiver,Facebook的Messenger在其清单中声明,其android.provider.Telephony.SMS_接收的广播接收器的优先级为2147483647 (遗憾的是,我们被迫不遵守文档中最高优先级为1000的标准,因为其他应用程序都有自己的规则) 我明白,如果我的优先级也设置为荒谬的高水平2147483647,那么我必须先安装我的应用程序才能优先于任何“关系”。没问题,我制作了一个屏幕,提醒用户可能需要卸载哪些应用程序,然后在我的应用程序正常运行后重新安装 但问题是,一切正常,但一旦手

Facebook的Messenger在其清单中声明,其
android.provider.Telephony.SMS_接收的广播接收器的优先级为
2147483647

(遗憾的是,我们被迫不遵守文档中最高优先级为1000的标准,因为其他应用程序都有自己的规则)

我明白,如果我的优先级也设置为荒谬的高水平
2147483647
,那么我必须先安装我的应用程序才能优先于任何“关系”。没问题,我制作了一个屏幕,提醒用户可能需要卸载哪些应用程序,然后在我的应用程序正常运行后重新安装

但问题是,一切正常,但一旦手机重新启动,“Messenger”就开始优先于我的应用程序。我找遍了所有的地方,想看看他们是怎么做到这一点的他们是如何做到这一点的?当首先安装我的应用程序时,如何在重新启动后获得优先级?

到目前为止,我唯一想到的是,在注册广播接收器时,程序包名称在启动时按字母顺序排列

comfacebook>comstrikeforcezero

我正要尝试在android.intent.action.BOOT_上注册我的广播接收器,但我感觉这行不通


Messenger还为android.provider.Telephony.SMS_RECEIVED设置了另一个“低隐修会广播接收器”(low priory broadcast receiver),设置为
-1

,这揭示了android机制中的一些错误,因为您认为他们放在清单中的数字并不是真正的数字。2147483647实际上是(-1),也就是2^31。为什么您认为先安装哪个应用程序很重要?

即使最大优先级值为1000,Facebook也使用最大整数值作为优先级。所以,如果你想有机会,我想说你也应该保持不变(2147483647)。提醒用户在安装应用程序后卸载并安装Facebook

要在重新启动后获得优先级,请执行以下操作:
您无法设置启动完成的优先级,因此,请尝试探索android源代码,特别是SystemServer.java,查看SystemServer启动并运行后&一旦启动完成,启动已注册的应用程序的顺序是什么?启动已完成。

我的怀疑是,首先安装的应用程序并不会破坏关系,而是首先运行的应用程序。在手动安装和卸载应用程序的情况下,您需要手动控制执行顺序。然后,当您重新启动时,执行顺序将被放弃给Android的启动行为。如果按字母顺序出现这种情况,则很容易进行测试:构建一个名为aaa的快速测试应用程序,并查看它在重新启动后是否保持优先级。如果启动顺序没有按字母顺序更改,请发表评论,我将确定启动顺序的设置方式。

当然

如果用户在facebook之前下载你的应用程序,那么你的接收者将优先,尽管两者的优先级都是2147483647。 重新启动后,Facebook的接收器优先,尽管两者具有相同的优先级,而您的接收器之前已安装。因此,可以肯定的是,诀窍在于他们的引导接收器

猜测

  • 作为第一步,将具有相同优先级2147483647的引导接收器(尽管优先级没有影响,但只需添加它)添加到您的应用程序中。尝试在facebook应用程序之前安装你的应用程序,然后重新启动手机。这可能与以下事实有关:在本例中,您的过程在facebook之前启动,而您的sms接收器将在facebook之前启动
  • 做同样的事情,但是将你的包名重命名为a.a.a,只是为了按字母顺序优先于facebook
  • 在启动接收器中,尝试添加以下代码:

    ComponentName component;
    component=new ComponentName(this, SmsReceiver.class);
    getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
    component = new ComponentName(this, SmsReceiver.class);
    getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
    
  • 了解你的引导接收器是否优先于facebook的引导接收器可能会很有用。我不确定这是否可能

  • 最后,有一个过程可以在清单中加以区分,但我不确定这在任何情况下是否方便


  • 这很重要,因为在设备重新启动之前,如果首先安装了我的应用程序,我可以中止广播。如果首先安装了Facebook messenger,他们将中止广播(仍将其写入内容提供商)。2147483647是最大的有符号4字节整数(0x7FFFFF)。如果再加上一个,则得到0x8000000,它是最小的4字节有符号整数(-2147483648),也相当于2^31。2147483647既不是-1,也不是2^31。2^31是-2147483648。在这种情况下,我认为用户应该能够选择哪个应用程序获得优先权。也许对Android开发团队来说是个好建议?这就是为什么我删除了Facebook的Messenger应用程序,并且没有更新正常的Facebook应用程序,我不想让FB控制一切。很抱歉反应太晚。与我的研究;我发现一个类名、活动名、包名为“aaa”的广播接收器被facebook messenger应用程序覆盖,与原始应用程序非常相似。并且,证明安装优先的概念是更高的优先级;原始应用程序优先于测试应用程序。然而,我仍然面临着这样一个问题:无论3个应用之间的安装时间如何,facebook messenger都会获得最高优先级。您的代码片段会禁用接收器。如果没有禁用行,它仍然不能超过facebook的优先级。。。包名称似乎也不起作用…:(