64

Facebook 的 Messenger2147483647对其android.provider.Telephony.SMS_RECEIVED广播接收器的优先级为 ,在其清单中声明。

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

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

但是,问题来了 - 一切正常,但是一旦手机重新启动,“Messenger”就会开始优先于我的应用程序。我到处寻找,看看他们是如何施展这种黑魔法的。他们如何做到这一点?当我的应用程序首先安装时,我如何在重启后获得优先权?

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

com。书 > com。s trikeforcezero

我正要尝试注册我的广播接收器,android.intent.action.BOOT_COMPLETED但我觉得这行不通。

Messenger 还有另一个“低修道院广播接收器”,用于android.provider.Telephony.SMS_RECEIVED设置为-1

4

4 回答 4

3

肯定的

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

猜测

  1. 第一步,将具有相同优先级 2147483647 的引导接收器(尽管优先级没有影响,但只需添加它)添加到您的应用程序。尝试在 facebook 的应用程序之前安装您的应用程序并重新启动手机。在这种情况下,这可能与您的流程在 facebook 之前开始并且您的短信接收器将在 facebook 之前开始的事实有关。
  2. 做同样的事情,但将你的包名重命名为 aaa 只是为了优先于 facebook 按字母顺序。
  3. 在您的引导接收器中,尝试添加以下代码:

    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. 尝试了解您的引导接收器是否优先于 facebook 的引导接收器可能很有用。我不确定这是否可能。

  5. 最后,有一个可以在清单中区分的过程,但不确定这是否可以方便。

于 2013-06-19T10:48:10.687 回答
2

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

要在重新启动后获得优先权:您无法为 boot_completed 设置优先级,因此,请尝试探索 android 源代码,尤其是 SystemServer.java 并查看 SystemServer 启动并运行后,一旦启动完成,使用什么顺序启动应用程序为 boot_completed 注册。

于 2013-05-17T20:08:33.303 回答
2

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

于 2013-06-13T20:37:15.610 回答
1

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

于 2013-05-13T21:30:34.537 回答