#android #intentfilter
#Android #intentfilter
Вопрос:
Я пытаюсь выполнить некоторый код при добавлении или удалении приложения. Я регистрирую широковещательный приемник и определяю фильтр намерений следующим образом:
mMyReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
intentFilter.addDataScheme("package");
intentFilter.setPriority(999);
registerReceiver(mMyReceiver, intentFilter);
Как указано вhttps://developer.android.com/guide/components/broadcast-exceptions.html Я даже могу зарегистрировать ACTION_PACKAGE_FULLY_REMOVED в моем AndroidManifest. Ну, когда я удаляю приложение, вызывается ACTION_PACKAGE_REMOVED, а также ACTION_PACKAGE_FULLY_REMOVED, которое зарегистрировано в моем файле манифеста. Однако, когда я устанавливаю приложение, ACTION_PACKAGE_ADDED не вызывается. Я не могу найти причины, почему. Это то же самое для всех других действий, связанных с пакетом. Единственные, которые я могу заставить работать, — это те, которые связаны с удалением. Я действительно надеюсь, что у кого-то еще есть какие-либо предложения о том, как это исправить. Большое спасибо!
Дополнение: на другом устройстве даже не вызываются намерения PACKAGE_REMOVED и PACKAGE_FULLY_REMOVED. Однако одна из 20 установок запускала намерение ACTION_PACKAGE_ADDED. Абсолютно странное поведение. И да, действие, которое используется для регистрации получателей, выполняется всегда, поэтому трансляции не являются незарегистрированными в любое время. Есть ли что-то, из-за чего эти намерения не всегда вызываются, я имею в виду, как один из 20 раз?
Дополнение 2: я получил в свои руки третье устройство. Похоже, что все устройства под управлением Android 11 (первое и третье устройства) запускают ACTION_PACKAGE_REMOVED и ACTION_PACKAGE_FULLY_REMOVED без проблем. Но они никогда не запускают ACTION_PACKAGE_ADDED. Однако второе устройство работает под управлением Android 10. Он никогда не вызывает ни одно из УДАЛЕННЫХ действий, но он вызывает ДОБАВЛЕННОЕ действие один раз из 20. Я не уверен на 100%, вызывает ли версия API эти разные поведения, но дерьмо становится сложнее. Я рад любому комментарию!
Дополнение 3: это становится сумасшедшим. Еще одно устройство Android 10 работает отлично и получает все значения, связанные с пакетом. Как такое непоследовательное поведение вообще возможно?
Комментарии:
1. Привет. Вы нашли какое-либо решение этой проблемы. Потому что я также сталкиваюсь с той же проблемой и также попробовал прослушиватель для добавленного пакета, но это также не помогло.
2. К сожалению, у меня этого нет. Я удивлен, что об этой проблеме, похоже, не сообщалось чаще. В любом случае, я должен признать, что я больше не исследовал это.
Ответ №1:
Это сработало для меня.
var packageAddedReceiver = PackageAddedReceiver()
val filter = IntentFilter()
filter.addAction(Intent.ACTION_PACKAGE_ADDED)
filter.addAction(Intent.ACTION_PACKAGE_REMOVED)
filter.addAction(Intent.ACTION_PACKAGE_REPLACED)
filter.addDataScheme("package")
requireContext().registerReceiver(packageAddedReceiver, filter)
и в манифесте
<receiver
android:name=".receiver.PackageAddedReceiver"
android:enabled="true"
android:exported="false">
<intent-filter android:priority="100">
<action android:name="android.intent.action.PACKAGE_INSTALL" />
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
Ошибка, которую я допустил, заключалась в том, что вместо этого я регистрировал своего получателя с помощью requireContext().registerReceiver(packageAddedReceiver, filter)
LocalBroadcastManager.getInstance(requireActivity())
Ответ №2:
Просто добавьте запрос разрешения на все пакеты в свой манифест.
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES" />