服务和单独应用程序之间的数据共享(单向通信)。 (Android)

Data sharing (one way communication) between service and a seperate app. (Android)

考虑在服务中生成的数据(连续),我希望其他应用程序从服务中检索数据。

示例:应用程序A(服务)将打开串口并与外部设备通信以获取数据。

应用程序 B(独立应用程序)必须从服务中读取数据(来自外部设备的数据)。我没有这样做,因为我需要从外部设备检索数据,即使应用程序 B 不是 运行 ning,我还有 3 个其他应用程序需要来自外部设备的相同数据,因此我决定 运行 后台服务。

你可以使用 Broadcasts.

在您的应用程序中,您可以将 Intent 广播到系统,然后其他应用程序可以接收到该服务。

在您的应用程序中,您可以像这样发送广播服务:

public class MyService extends Service {

    public static final String ACTION_PUBLISH_DATA = "com.example.action.publish_data";

    public void publishResult(Bundle data) {
        Intent intent = new Intent(ACTION_PUBLISH_DATA);
        intent.putExtras(data);
        sendBroadcast(intent);
    }

}

在您的客户端应用程序中,创建一个广播接收器:

public class DataBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // do something with data in the intent.
    }

}

并像这样在您的清单中注册它:

<application>
    ...

    <receiver android:name="com.example.DataBroadcastReceiver">
        <intent-filter>
            <action android:name="com.example.action.publish_data" />
        </intent-filter>
    </receiver>

</application>

除了在您的清单中注册,您还可以使用 registerReceiver 方法在运行时注册接收器

编辑:
据我所知,这是在多个应用程序之间进行通信的最简单方法。但请注意:如评论中所述,这不是 应要求。该服务知道谁或任何人正在收听广播。
但是,您可以从客户端应用程序向服务应用程序发送广播以启动或停止服务。
您还可以在您的 App A 中使用 IntentService 并从其他应用程序启动它(在 extras 中使用 ResultReceiver)。 或者您也可以查看 ContentProviders

AIDL 是一个选项,但我不建议您这样做,因为它更高级。