如何让清单声明的广播接收器与活动或服务进行通信?

问题描述 投票:0回答:2

这应该是显而易见的,但我找不到解决方案。很多人都问过这个问题,答案通常是切换到上下文注册的接收器。我有一个辅助服务,当清单声明的接收者拾取某些内容时需要通知该服务。显然,这不能通过接口来完成,因为我找不到获取接收器实例的方法。这是一些代码:

清单

<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;
    }
}
android broadcastreceiver accessibility android-broadcast
2个回答
1
投票

我多次询问具体场景,但您并没有真正提供任何具体场景,因此我将用一个抽象场景来回答:假设您的广播旨在向服务发送命令。

在这种情况下,您可以:

  1. 实现单例(这里称为

    CommandBus
    ,因为缺乏更好的名称)。理想情况下,该单例将由依赖倒置框架(例如 Dagger/Hilt)设置。

  2. CommandBus
    公开一些反应式方式来向服务获取命令。如果您使用的是 Kotlin,那可能是
    SharedFlow
    。由于您使用的是 Java,因此这可能是一个 RxJava
    Observable
    ,或者可能是一个简单的回调。

  3. MyAccessibilityService
    访问
    CommandBus
    单例并使用您在步骤#2中设置的任何内容来查找命令。

  4. 拥有

    CommandBus
    公开 API 以将命令传递给服务(例如,
    sendCommand()
    方法)。

  5. MyBroadcastReceiver
    访问
    CommandBus
    单例并调用
    onReceive()
    中步骤 #4 中的方法。

此时,当

MyBroadcastReceiver
收到广播时,它会告诉
CommandBus
发送命令,然后该命令流向
MyAccessibilityService
,后者会执行某些操作。


0
投票

在无障碍服务的 onServiceConnected() 上注册广播接收器,然后你可以调用它打开无障碍或使用 adb 命令

© www.soinside.com 2019 - 2024. All rights reserved.