这应该是显而易见的,但我找不到解决方案。很多人都问过这个问题,答案通常是切换到上下文注册的接收器。我有一个辅助服务,当清单声明的接收者拾取某些内容时需要通知该服务。显然,这不能通过接口来完成,因为我找不到获取接收器实例的方法。这是一些代码:
清单:
<service
android:name=".MyAccessibilityService"
android:exported="true"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:process=":listenerProcess4">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibilityservice" />
</service>
<receiver
android:name=".MyBroadcastReceiver"
android:exported="false"
android:process=":listenerProcess4">
<intent-filter>
<action android:name="roastie_toastie" />
</intent-filter>
</receiver>
接收者:
public class MyBroadcastReceiver extends BroadcastReceiver {
BroadcastReceivedListener mBroadcastReceivedListener;
public void setBroadcastReceivedListener(BroadcastReceivedListener broadcastReceivedListener) {
mBroadcastReceivedListener = broadcastReceivedListener;
}
@Override
public void onReceive(Context context, Intent intent) {
mBroadcastReceivedListener.broadcastReceived();
}
public interface BroadcastReceivedListener {
void broadcastReceived();
}
}
我的辅助功能服务:
public class MyAccessibilityService extends AccessibilityService implements MyBroadcastReceiver.BroadcastReceivedListener {
boolean lightsAreOn = true;
@Override
public void broadcastReceived() {
lightsAreOn = false;
}
}
我多次询问具体场景,但您并没有真正提供任何具体场景,因此我将用一个抽象场景来回答:假设您的广播旨在向服务发送命令。
在这种情况下,您可以:
实现单例(这里称为
CommandBus
,因为缺乏更好的名称)。理想情况下,该单例将由依赖倒置框架(例如 Dagger/Hilt)设置。
让
CommandBus
公开一些反应式方式来向服务获取命令。如果您使用的是 Kotlin,那可能是 SharedFlow
。由于您使用的是 Java,因此这可能是一个 RxJava Observable
,或者可能是一个简单的回调。
让
MyAccessibilityService
访问CommandBus
单例并使用您在步骤#2中设置的任何内容来查找命令。
拥有
CommandBus
公开 API 以将命令传递给服务(例如,sendCommand()
方法)。
让
MyBroadcastReceiver
访问 CommandBus
单例并调用 onReceive()
中步骤 #4 中的方法。
此时,当
MyBroadcastReceiver
收到广播时,它会告诉 CommandBus
发送命令,然后该命令流向 MyAccessibilityService
,后者会执行某些操作。
在无障碍服务的 onServiceConnected() 上注册广播接收器,然后你可以调用它打开无障碍或使用 adb 命令