多次注册到同一个接收者

Posted

技术标签:

【中文标题】多次注册到同一个接收者【英文标题】:Registering to Same Receiver Multiple times 【发布时间】:2016-03-12 04:19:31 【问题描述】:

出于某种原因,我需要多次注册到同一个接收器,例如清单中的一个和代码中的一个。即使应用程序未运行但已安装,我也想听包更改。

1.在androidManifest.xml中

<receiver android:name="PackageChangeReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_CHANGED" />
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <action android:name="android.intent.action.PACKAGE_REPLACED" />
        <data android:scheme="package" />
    </intent-filter>

2.同样在我注册到BroadcastReceiver的代码中,在构造函数中使用如下代码sn-p。

public PackageChangeReceiver(@ForApplication Context context) 
    super();
    IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
    filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
    filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
    filter.addDataScheme("package");
    context.registerReceiver(this, filter);

但不知何故,Android 有时会间歇性地接收其中一个。较新版本中是否有任何文档,例如 Android OS 本身的性能改进,例如虽然注册了多次,但只接收一个广播。是设备、操作系统还是版本特定的东西?

【问题讨论】:

Android 应用程序只能有一个具有一个名称的 BroadcaseReceiver。如果你想要多个接收器,你可以创建不同名称的广播接收器。 实际上,当我设置断点并禁用/启用默认应用程序时,它会间歇性地工作。我每次收到 2 次。我也有一个名称相同的广播接收器。但是我注册了两次。 我建议您只注册一次 BroadcastReceiver。如果您动态需要它,只需从 Android Manifest 中删除声明 【参考方案1】:

我找到了解决方案。 Marshmallow 不允许多次注册到同一个广播接收器。但是如果操作系统版本小于或等于 LOLLIPOP_MR1,注册到同一个广播接收器是可以容忍的。 但是由于 Marshmallow(API 23) 不允许这样做,我们可以进行这样的性能改进。

private static final boolean REGISTER_DUPLICATE_RECEIVER = VERSION.SDK_INT <= VERSION_CODES.LOLLIPOP_MR1;

if (REGISTER_DUPLICATE_RECEIVER) 
        IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
        filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
        filter.addDataScheme("package");
        context.registerReceiver(this, filter);
    

【讨论】:

以上是关于多次注册到同一个接收者的主要内容,如果未能解决你的问题,请参考以下文章

多个模板真的需要多次注册吗?

带有 Spring JMS 的 Azure 接收多次接收相同的消息并将消息移动到 DLQ

Javascript:编写一个接收数字的函数,并多次返回一个包含该数字的数组

Android系统是在一个进程中多次向多个接收者发送BOOT_COMPLETED意图还是一次?

secureCRT注册机多次连接失败,怎么办?

Android 两种注册发送广播的区别