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
Ответы
Ответ 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. Почему вы считаете, что это вопрос, какое приложение было установлено первым?