Проверка наличия объявления BroadcastReceiver в манифесте во время выполнения?

Есть ли способ проверить, какие BroadcastReceivers объявлены в манифесте, во время выполнения?

С PackageManager вы можете queryBroadcastReceivers() чтобы найти, кто будет реагировать на конкретное Intent , и с помощью getInstalledPackages() вы можете узнать получателей, установленных на пакет.

Код будет подобен этому: изнутри Activity:

 // Query all packages that have the BroadcastReceivers... Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); PackageManager pm = getPackageManager(); final List<ResolveInfo> listPkgs = pm.queryBroadcast(mainIntent, 0); if (listPkgs != null && listPkgs.size() > 0){ for(ResolveInfo resInfo : listPkgs){ // Now resInfo will contain the list of packages that has receivers... } } 

Спасибо, но не был моим намерением … Я хотел узнать, объявлен ли конкретный приемник в запущенном приложении во время выполнения, и достиг его так:

  private <Receiver extends CyborgReceiver<?>> boolean checkIfBroadcastReceiverIsRegisteredInManifest(Class<Receiver> receiverType) { PackageManager pm = application.getPackageManager(); try { ActivityInfo info = pm.getReceiverInfo(new ComponentName(application, receiverType), PackageManager.GET_RECEIVERS); return info.enabled; } catch (NameNotFoundException e) { return false; } } 

Передайте объект приложения в качестве первого аргумента, вы можете сделать это с помощью (Application)context.GetApplicationContext() если вам нужно, а затем передать в свой класс, который реализует класс вещательного приемника в качестве второго аргумента, например, broadcastReceiver.class

 public static boolean validateReceiverInManifest(Application application, Class receiverClass) throws PackageManager.NameNotFoundException { PackageManager pm = application.getPackageManager(); String packageName = application.getPackageName(); PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_RECEIVERS); ActivityInfo[] receivers = packageInfo.receivers; String receiverClassName = receiverClass.getName(); for (ActivityInfo activityInfo : receivers) { if (activityInfo.name.equals(receiverClassName)) { return true; } } return false; }