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
,另一个事件总线实现等 - 而不是本质上复制接收器。
有什么方法可以从代码中获取 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
,另一个事件总线实现等 - 而不是本质上复制接收器。