Подтвердить что ты не робот

Facebook "Messenger" имеет приемник SMS-вещания, который имеет наивысший приоритет после перезагрузки

Facebook Messenger имеет приоритет 2147483647 для своего приемника вещания android.provider.Telephony.SMS_RECEIVED, объявленного в их манифесте.

(Печально, что мы вынуждены не следовать стандартам документации с максимальным приоритетом 1000, потому что другие приложения создают свои собственные правила)

Я понимаю, что если мой приоритет также установлен на смехотворно высокий уровень 2147483647, который я должен был бы установить, чтобы приложение было первым, чтобы иметь приоритет над любыми "связями". Нет проблем, я сделал экран, чтобы предупредить пользователей о том, какие приложения, вероятно, нужно будет удалить, а затем повторно установить после того, как мое приложение будет функционировать должным образом.

Но здесь проблема: все работает нормально, но как только телефон перезагружается, "Messenger" начинает получать приоритет над моим приложением. Я повсюду посмотрел, как они могут сделать эту черную магию. Как они это делают? Как получить приоритет после перезагрузки, когда мое приложение установлено первым?

Единственное, что дошло до сих пор, - это имена пакетов, которые упорядочиваются в алфавитном порядке при загрузке при регистрации широковещательных приемников.

ком. f acebook > com. s trikeforcezero

Я собирался попытаться зарегистрировать свой вещательный приемник на android.intent.action.BOOT_COMPLETED, но у меня такое чувство, что это не сработает.

У Messenger также есть другой "приемник с низким приоритетом вещания" для android.provider.Telephony.SMS_RECEIVED, установленный на -1

4b9b3361

Ответ 1

Конечно:

Если пользователь загружает ваше приложение перед facebook, ваш получатель будет иметь приоритет, хотя оба имеют приоритет 2147483647. После перезагрузки приемник Facebook имеет приоритет, хотя оба имеют тот же приоритет, а ваш ранее был установлен. Поэтому, конечно, трюк в их BootReceiver.

Догадки

  • В качестве первого шага добавьте загрузочный приемник с тем же приоритетом 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. Я не уверен, что это возможно.

  • Наконец, есть процесс, который может быть дифференцирован в манифесте, но я не уверен, что это может быть удобно в любом случае.

Ответ 2

Несмотря на то, что максимальное значение приоритета равно 1000, в качестве приоритета Facebook используется наибольшее целочисленное значение. Поэтому, я бы сказал, вы также должны сохранить то же самое (2147483647), если хотите иметь шанс. Предупреждайте пользователей об удалении и установке Facebook после установки вашего приложения.

Чтобы получить приоритет после перезагрузки: Вы не можете установить приоритет для boot_completed так, попробуйте Исходный исходный код Android, особенно SystemServer.java, и посмотрите, как только SystemServer запущен, и как только загрузка завершена, какой порядок используется для запуска приложений, зарегистрированных для boot_completed.

Ответ 3

Мое подозрение было бы в том, что связь не нарушена приложением, установленным вначале, а приложением, которое запускается первым. В случае, когда вы вручную устанавливаете и удаляете приложения, вы вручную контролируете порядок выполнения. Затем, когда вы перезагружаетесь, заказ на выполнение отказывается от поведения запуска Android. Было бы легко проверить, происходит ли это в алфавитном порядке: создайте имя приложения быстрого тестирования aaa и посмотрите, сохраняет ли он приоритет после перезагрузки. Если порядок загрузки не изменяется в алфавитном порядке, прокомментируйте, и я пойду, как будет настроен порядок запуска.

Ответ 4

Это показывает некоторую ошибку в Android-механизме, поскольку число, которое, по их мнению, они вносят в манифест, не является номером. 2147483647 действительно (-1), который равен 2 ^ 31. Почему вы считаете, что это вопрос, какое приложение было установлено первым?