Facebook的“Messenger”具有SMS广播接收器,在重启后优先级最高。

64

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

(很遗憾,我们被迫不遵循文档规定的最大优先级为1000,因为其他应用程序制定了自己的规则)

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

但是,这里出现了问题-一切正常工作,但是一旦手机重新启动,“Messenger”开始优先于我的应用程序。 我已经到处寻找他们如何进行此黑魔法的方法。他们是如何做到的?当我的应用程序首先安装时,我如何在重新启动后获得优先权?

到目前为止,唯一想到的事情是在注册广播接收器时按包名称字母顺序进行排序。

com. f acebook > com. s trikeforcezero

我打算尝试在android.intent.action.BOOT_COMPLETED上注册我的广播接收器,但我有一种感觉这行不通。

Messenger还设置了另一个android.provider.Telephony.SMS_RECEIVED的“低优先级广播接收器”,其值为-1


3
在这种情况下,我认为用户应该能够选择哪个应用程序优先。或许这是一个给Android开发团队的好建议?这就是我删除了Facebook Messenger应用程序并且不更新普通的Facebook应用程序的原因,我不想让Facebook掌控一切。 - Dediqated
4个回答

3

当然:

如果用户在下载Facebook之前下载了您的应用程序,则您的接收器将优先,尽管两者的优先级均为2147483647。 重启后,尽管两者具有相同的优先级且您的应用程序是先安装的,但Facebook的接收器将具有优先权。因此,毫无疑问,诀窍在于他们的BootReceiver。

猜测:

  1. As a first step, add a boot receiver with the same priority 2147483647 (although priority has no effect but just add it) to your app. Try to install your app before facebook's app and restart the phone. It might be related to the fact that your process starts before facebook in this case and your sms receiver will start before facebook's.
  2. Do the same thing but rename your package name to a.a.a just to have precedence over facebook Alphabetically.
  3. In your Boot Receiver, try to add the following code:

    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);
    
  4. It might be useful to try to know whether your boot receiver is taking precedence over facebook's boot receiver. I am not sure if that is possible.

  5. Finally, there is the process which can be differentiated in the manifest but am not sure if that can be handy in anyway.


你的代码片段禁用了接收器。即使没有禁用行,它仍然无法击败Facebook的优先级...包名称似乎也不起作用... :( - StrikeForceZero

2
尽管最大优先级值为1000,但Facebook使用了最大整数值作为优先级以便排在首位。因此,如果您希望有机会,我建议您也保持相同的值(2147483647)。在您的应用程序安装完成后,请提醒用户卸载并重新安装Facebook。
要在重启后获得优先权: 您无法为boot_completed设置优先级,因此,请尝试探索Android源代码,特别是SystemServer.java,并查看一旦SystemServer已经运行并且引导完成后,用于启动已注册boot_completed的应用程序的顺序是什么。

2

我猜测,应用程序的启动顺序并不是由先安装的应用程序决定的,而是由先运行的应用程序决定的。在手动安装和卸载应用程序的情况下,您可以手动控制执行顺序。然后,当您重新启动时,执行顺序将被交给Android的启动行为。如果按字母顺序排列,则很容易测试是否发生这种情况:构建一个名为aaa的快速测试应用程序,并查看它是否在重新启动后保持优先级。如果启动顺序没有按字母顺序更改,请留言,我会去了解启动顺序的设置。


抱歉回复晚了。通过我的研究,我发现一个类名、活动名和包名为“aaa”的广播接收器会被Facebook Messenger应用程序覆盖,就像原始应用程序一样。并且,为了证明先安装的应用程序具有更高的优先级的概念,原始应用程序优先于测试应用程序。然而,我仍然面临Facebook Messenger占据最高优先级的问题,无论这3个应用程序之间的安装时间如何。 - StrikeForceZero

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

它很重要,因为在设备重新启动之前,如果我的应用程序先安装,我可以中止广播。如果Facebook Messenger先安装,则他们会中止广播(仍将其写入内容提供程序)。 - StrikeForceZero
3
2147483647是有符号4字节整型中的最大值(0x7FFFFFFF)。加一后得到0x80000000,这是4字节有符号整型的最小值(-2147483648),也等于2的31次方。 - abh
2
2147483647不是-1,也不是2^31。2^31是-2147483648。 - abh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接