3

実行時にマニフェストでどの BroadcastReceivers が宣言されているかを確認する方法はありますか?

4

4 に答える 4

3

を使用すると、特定のに応答する人を見つけるPackageManagerことができます。を使用すると、パッケージごとにインストールされているレシーバーを見つけることができます。queryBroadcastReceivers()IntentgetInstalledPackages()

于 2012-08-10T00:14:57.147 に答える
3

アクティビティ内からのコードは、次のようになります。

// 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...
   }
}
于 2012-08-10T00:40:08.243 に答える
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;
    }
}
于 2012-08-13T21:27:07.103 に答える
0

アプリケーションオブジェクトを最初の引数として(Application)context.GetApplicationContext()渡します。必要に応じてこれを行うことができます。次に、ブロードキャストレシーバークラスを実装するクラスを2番目の引数として渡します。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;
}
于 2015-06-12T05:17:33.887 に答える