有没有办法从代码中获取Manifest.xml中定义的BroadcastReceiver的引用?
就我而言,我们正在使用需要包含在Manifest.xml中的BroadcastReceiver。但是它有我想在代码中重用的功能。因此,不是创建另一个类似的BroadcastReceiver并从代码中实例化它,而是希望获得对现有代码的引用。
其他信息:
我的目标是从我的活动订阅我的BroadcastReceiver上的事件 - 我想重用的事件 - 而不是在我的活动中创建此接收器的另一个实例我想获得对现有活动的引用。
答案 0 :(得分:4)
在清单中注册BroadcastReceiver
时,您正在注册该类,而不是它的实例。每当您<receiver>
需要处理的广播发生时,就会创建一个新的实例,因此您无法在描述时获得对该实例的引用。
动态实例化和注册您在清单中静态注册的Receiver类的实例是完全可以的。不过,我会注意到,如果静态注册的课程无论如何都要运行 - 也就是说,如果它要处理与动态注册的广播相同的广播 - 你可能会考虑通知你的{{1}来自Receiver类 - 例如,使用Activity
,另一个事件总线实现等 - 而不是基本上复制接收器。
答案 1 :(得分:0)
无需“获取已注册的BroadcastReceiver
的参考”。
只需发送Intent
可由BroadcastReceiver
处理的Context
,即可从您拥有context.sendBroadcast(intent);
的代码的任何位置触发其操作。
BroadcastReceiver
如果你想在不调用BroadcastReceiver
的情况下调用'纯逻辑',你必须从中提取逻辑到某个POJO类并直接调用该类省略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
,而无需了解SetTitleMatchMode, 3
SndVolWasStarted = 0
;Turn off SndVol after 1 second
Loop {
Sleep, 10
If SndVolWasStarted = 1
{
GetKeyState, StateF1, F1
GetKeyState, StateF2, F2
If (StateF1 = "D" or StateF2 = "D")
SndVolStartTime = %A_Now%
Else {
If ((A_Now - SndVolStartTime > 1) and WinExist("ahk_class #32770"))
WinClose, ahk_class #32770
}
IfWinNotExist, ahk_class #32770
SndVolWasStarted = 0
}
}
;Hotkey to decrease volume
F1::
IfWinExist, Windows Media Player
{
IfWinNotExist, ahk_class #32770
{
Run, "%A_WinDir%\System32\SndVol.exe" -r 88888888
WinWait, ahk_class #32770
SndVolWasStarted = 1
}
ToolbarWindowNumber = 322
msctls_trackbarNumber = 321
Loop {
ControlGetText, ControlName, ToolbarWindow%ToolbarWindowNumber%, ahk_class #32770
If ControlName = Mute for Windows Media Player
{
ControlSend, msctls_trackbar%msctls_trackbarNumber%, {Down}, ahk_class #32770 ; Use {Down 2} to change sound level faster
Break
} Else {
If ToolbarWindowNumber < 328
{
ToolbarWindowNumber := ToolbarWindowNumber + 2
msctls_trackbarNumber := msctls_trackbarNumber + 1
} Else {
If ToolbarWindowNumber = 328
{
ToolbarWindowNumber = 3210
msctls_trackbarNumber := msctls_trackbarNumber + 1
} Else {
If ToolbarWindowNumber < 3242
{
ToolbarWindowNumber := ToolbarWindowNumber + 2
msctls_trackbarNumber := msctls_trackbarNumber + 1
} Else {
MsgBox, 16, AutoHotkey, ERROR: Application's volume control was not found!`nThis could occur if the Volume Mixer has more than 20 opened applications
Break
}
}
}
}
}
}
Return
;Hotkey to increase volume
F2::
IfWinExist, Windows Media Player
{
IfWinNotExist, ahk_class #32770
{
Run, "%A_WinDir%\System32\SndVol.exe" -r 88888888
WinWait, ahk_class #32770
SndVolWasStarted = 1
}
ToolbarWindowNumber = 322
msctls_trackbarNumber = 321
Loop {
ControlGetText, ControlName, ToolbarWindow%ToolbarWindowNumber%, ahk_class #32770
If ControlName = Mute for Windows Media Player
{
ControlSend, msctls_trackbar%msctls_trackbarNumber%, {Up}, ahk_class #32770 ; Use {Up 2} to change sound level faster
Break
} Else {
If ToolbarWindowNumber < 328
{
ToolbarWindowNumber := ToolbarWindowNumber + 2
msctls_trackbarNumber := msctls_trackbarNumber + 1
} Else {
If ToolbarWindowNumber = 328
{
ToolbarWindowNumber = 3210
msctls_trackbarNumber := msctls_trackbarNumber + 1
} Else {
If ToolbarWindowNumber < 3242
{
ToolbarWindowNumber := ToolbarWindowNumber + 2
msctls_trackbarNumber := msctls_trackbarNumber + 1
} Else {
MsgBox, 16, AutoHotkey, ERROR: Application's volume control was not found!`nThis could occur if the Volume Mixer has more than 20 opened applications
Break
}
}
}
}
}
}
Return
。
尽量避免在Android类中添加逻辑。
最好在POJO Java类中使用逻辑,因为它有助于保持SRP原则的存在并使测试更容易。