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

2022-08-31 15:26:58

Facebook的Messenger,有一个优先级,为他们的广播接收器,在他们的清单中声明。2147483647android.provider.Telephony.SMS_RECEIVED

(可悲的是,我们被迫不遵循文档的最大优先级为1000的标准,因为其他应用程序会制定自己的规则)

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

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

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

com. f acebook > com. s trikeforcezero

我正要尝试注册我的广播接收器,但我有一种感觉,这不起作用。android.intent.action.BOOT_COMPLETED

信使还有另一个“低序广播接收器”设置为android.provider.Telephony.SMS_RECEIVED-1


答案 1

当然

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

猜测

  1. 第一步,将具有相同优先级2147483647启动接收器(尽管优先级不起作用,但只需添加它)添加到你的应用。尝试在Facebook的应用程序之前安装您的应用程序,然后重新启动手机。这可能与您的流程在这种情况下在Facebook之前开始并且您的短信接收器将在Facebook之前开始的事实有关。
  2. 做同样的事情,但将你的软件包名称重命名为a.a.a,只是为了优先于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. 最后,还有一个过程可以在清单中区分,但我不确定这是否方便。


答案 2

尽管最大优先级值为 1000,但 Facebook 使用最大整数值作为优先级。所以,我想说,如果你想有机会,你也应该保持原样(2147483647)。提醒用户在安装您的应用后卸载并安装 Facebook。

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