Android - 获取对 Manifest 中定义的 BroadcastReceiver 的引用

Android - get a reference to a BroadcastReceiver defined in Manifest

有什么方法可以从代码中获取 Manifest.xml 中定义的 BroadcastReceiver 的引用吗?

在我的例子中,我们使用的是需要包含在 Manifest.xml 中的 BroadcastReceiver。但是它具有我想在我们的代码中重用的功能。因此,我不想创建另一个类似的 BroadcastReceiver 并从代码中实例化它,而是希望获得对现有 BroadcastReceiver 的引用。

附加信息:

我的目标是从我的 activity 订阅我的 BroadcastReceiver 上的一个事件——一个我想重用的事件——而不是在我的 activity 中创建这个接收器的另一个实例我会想获得对现有的引用。

不需要'obtain a reference'到已经注册的BroadcastReceiver

只需发送可由 BroadcastReceiver 处理的 Intent 即可从您拥有 Context.

的代码的任何位置触发其操作
context.sendBroadcast(intent);

如果你想在不调用 BroadcastReceiver 的情况下调用 'pure logic' 你必须从它提取逻辑到一些 POJO class 并直接调用 class 省略 BroadcastReceiver.

class LocationReceiver extends BroadcastReceiver {

       private SomeAction action;

       public LocationReceiver(){
           action = new SomeAction();
       }

        @Override
        public void onReceive(Context context, Intent intent) {
            action.execute();
        }
    };

BroadcastReceiver 可以简单地调用 execute() 但它不知道它是如何工作的。 您可以在代码中的任何地方重复使用 SomeAction,而无需完全了解 BroadcastReceiver

尽量避免在 Android classes 中放入逻辑。

最好在 POJO Java classes 中包含逻辑,因为它有助于保持 SRP 原则并使测试更容易。

在清单中注册 BroadcastReceiver 时,您注册的是 class,而不是它的一个实例。每次发生您的 <receiver> 需要处理的广播时,都会创建一个新实例来执行此操作,因此您无法真正获得对您所描述的广播的引用。

动态实例化和注册 Receiver class 的实例是完全没问题的,您也在清单中静态注册了它。不过,我要注意的是,如果静态注册的 class 无论如何都会成为 运行 - 也就是说,如果它将处理与动态注册的广播相同的广播 - 你可以考虑只通知你的Activity 来自接收器 class - 例如,使用 LocalBroadcastManager,另一个事件总线实现等 - 而不是本质上复制接收器。