在运行时检查BroadcastReceiver是否在清单文件中声明?

3
有没有一种方法在运行时检查清单中声明的BroadcastReceiver?
4个回答

3

代码将类似于这样,在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...
   }
}

3
使用 PackageManager,您可以使用 queryBroadcastReceivers() 查找哪些应用程序将响应特定的 Intent,并使用 getInstalledPackages() 查找每个包安装的接收器。

1

谢谢,但这不是我的意图... 我想知道在运行时是否声明了特定的接收器,并通过以下方式实现:

    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;
    }
}

CyborgReceiver扩展了BroadcastReceiver,关于过滤器,我真的不记得是什么情况了。 - TacB0sS
我认为这与监控应用程序中的呼叫事件有关。 - TacB0sS

0

将应用程序对象作为第一个参数传递,如果必须这样做,则可以使用(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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接