PACKAGE_ADDED BroadcastReceiver не работает
У меня есть зарегистрированный вещатель в Манифесте:
<application ...>
<receiver android:name="com.some.pkg.NewAppReceiver" >
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
</intent-filter>
</receiver>
</appcication>
И получатель:
public class NewAppReceiver extends BroadcastReceiver {
private static final String TAG = "NewAppReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Intent: " + intent.getAction());
}
}
И ничего не получается, когда я устанавливаю APK вручную или из Android Market. Зачем?
6 ответов
Запускали ли вы приложение, содержащее этот broadcastReceiver, перед установкой других приложений?
Начиная с некоторой версии API, широковещательные приемники не будут работать, пока вы не запустите приложение. Поместите упражнение и выполните его.
Также не забудьте добавить следующее в broadcastReceiver:
<data android:scheme="package" />
РЕДАКТИРОВАТЬ: на Android 8 и выше, если ваше приложение предназначено для API 27 или более, оно будет работать частично, поэтому вы должны зарегистрироваться на эти события в коде, а не в манифесте. Вот список намерений, которые все еще безопасно использовать в манифесте: https://developer.android.com/guide/components/broadcast-exceptions.html.
Остальные должны быть использованы в коде. Больше информации здесь
Поскольку android.intent.action.PACKAGE_ADDED является Системным Намерением (обратите внимание, что ваше собственное приложение не получит его при установке), ваш BroadcastReceiver будет получать сообщения из источников вне вашего приложения. Таким образом, проверка, которую вы НЕ ставили: android: exported = "false"
Вам также может понадобиться добавить:
<data android:scheme="package" />
Итак, ваш BroadcastReceiver в вашем AndroidManifest.xml должен выглядеть так:
<application ...>
<receiver android:name=".NewAppReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
</appcication>
Если это все еще не работает, вы можете попытаться установить более высокий приоритет, например: android: priority = "1000"
Взгляните на: http://developer.android.com/guide/topics/manifest/receiver-element.html
Регистрация получателя из манифеста не будет работать с API 26(android 8). Потому что это влияло на производительность более старых версий.
Но мы можем зарегистрировать приемник из java-кода и получать обновления удаленных и добавленных приложений.
val intentFilter = IntentFilter()
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED)
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED)
intentFilter.addDataScheme("package")
registerReceiver(YourBroadcastReceiver(), intentFilter)
Вы пытаетесь получить намерение в приложении, которое вы устанавливаете? Документация для ACTION_PACKAGE_ADDED гласит:
Обратите внимание, что недавно установленный пакет не получает эту рассылку.
Другая возможность состоит в том, что это намерение может быть доставлено не компонентам, зарегистрированным через манифест, а только вручную (как описано в ответе Марка Мерфи на вопрос переполнения стека. Не удается получить широковещательные сообщения для намерений PACKAGE).
Если вы пытаетесь получить какой-то другой пакет, он должен работать.
(Как заметил @Savvas) Если вы попытаетесь получить дополнение своего пакета, вы не сможете его получить. Даже если ваш вещательный приемник имеет action.PACKAGE_ADDED
, получатель onReceive
метод не срабатывает.
В этом случае вам лучше всего сохранить эти данные. Используя sharedPreferences
добавьте ключ что-то вроде "appIsWorkedBefore", и в методе onCreate вашего средства запуска Activity установите эту переменную как "true". И вы можете делать свои работы в отношении этого логического.
Это намеренное действие больше недоступно для приложений.
This is a protected intent that can only be sent by the system.
https://developer.android.com/reference/android/content/Intent#ACTION_PACKAGE_ADDED