Вызывается намерение ACTION_PACKAGE_REMOVED, тогда как ACTION_PACKAGE_ADDED не является

#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" />