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

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

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

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

但是,这里的问题 – 一切工作正常,但只要手机重新启动,“信使”开始优先于我的应用程序。 我到处看看他们怎么可以做这个黑魔法。 他们如何做到这一点? 在我的应用程序首次安装后,如何获得重新启动后的优先级?

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

COM。 f acebook> com。 s trikeforcezero

我正要尝试注册我的广播接收机android.intent.action.BOOT_COMPLETED但我有一种感觉,这将无法正常工作。

Messenger还有另一个“低价值的广播接收器” android.provider.Telephony.SMS_RECEIVED设置为-1

当然

如果用户在Facebook之前下载你的应用程序,那么你的接收器将优先,虽然两者都有优先级2147483647.重新启动后,Facebook的接收器优先,虽然两者具有相同的优先级,你的安装之前。 因此,当然,诀窍在于BootReceiver。

猜测

  1. 作为第一步,添加一个具有相同优先级的引导接收器2147483647(尽pipe优先级没有效果,但只是添加它)到您的应用程序。 尝试在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. 最后,还有一个可以在清单中区分的过程,但是不知道这个过程是否可以方便。

尽pipe最大优先级值是1000,但Facebook使用最大的整数值作为优先级。 所以,如果你想有一个机会,我会说你也应该保持不变(2147483647)。 警告用户在安装应用程序后卸载并安装Facebook。

重新启动后优先级:你不能设置boot_completed的优先级,所以试着去探索一下android源代码,特别是SystemServer.java,看看SystemServer启动并运行一次。一旦启动完成,用什么命令启动应用程序注册为boot_completed。

我的怀疑是,关系不是先安装的应用程序,而是先运行的应用程序。 在手动安装和卸载应用程序的情况下,手动控制执行顺序。 然后,当你重新启动,执行顺序放弃Android的发射行为。 如果按字母顺序进行testing,将很容易:构build一个快速testing应用程序名称aaa,并在重新引导后查看它是否保持优先级。 如果启动顺序没有按字母顺序改变,那么注释和我将解决如何设置启动顺序。

这揭示了Android机制中的一些错误,因为你认为它们放在清单中的数字并不是真正的数字。 2147483647真是(-1)这是2 ^ 31。 你为什么认为首先安装应用程序的问题?