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

Android 服务和独立应用程序之间的数据共享(单向通信)。(安卓),android,service,usb,background-process,Android,Service,Usb,Background Process,考虑在服务中生成的数据(连续),我希望其他应用程序从服务中检索数据 示例:应用程序A(服务)将打开串行端口并与外部设备通信以获取数据 应用程序B(独立应用程序)必须从服务读取数据(来自外部设备的数据)。我没有这样做,因为即使应用程序B未运行,我也需要从外部设备检索数据,并且我还有3个其他应用程序需要从外部设备获取相同的数据,因此,我决定在后台运行服务。您可以使用 在使用该服务的应用程序中,您可以向系统广播意图,然后其他应用程序可以接收这些意图 在使用该服务的应用程序中,您可以发送如下广播: pu

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

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

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

您可以使用

在使用该服务的应用程序中,您可以向系统广播意图,然后其他应用程序可以接收这些意图

在使用该服务的应用程序中,您可以发送如下广播:

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);
    }

}
<application>
    ...

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

</application>
在客户端应用程序中,创建广播接收器:

public class DataBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // do something with data in the 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);
    }

}
<application>
    ...

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

</application>
方法

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

是一个选项,但我不建议您使用它,因为它更高级

你可以用

在使用该服务的应用程序中,您可以向系统广播意图,然后其他应用程序可以接收这些意图

在使用该服务的应用程序中,您可以发送如下广播:

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);
    }

}
<application>
    ...

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

</application>
在客户端应用程序中,创建广播接收器:

public class DataBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // do something with data in the 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);
    }

}
<application>
    ...

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

</application>
方法

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


是一个选项,但我不建议您使用它,因为它更高级ContentProvider
(在这里设置
query()
)来处理请求,就像REST Web服务一样,生成响应)。如果您是通过HTTP执行此操作,我建议要么查看Web套接字,要么考虑切换到用户的数据。HTTP是一种请求/响应协议。管理数据接收有很多复杂性。最好不要使用该服务,让客户了解他们需要什么。数据更改的频率是多少?数据的大小是多少?您是在寻找推送解决方案(服务执行某些操作以将更改传递给客户机)、拉式解决方案(服务仅响应客户机的数据请求),还是两者兼而有之?注意,这与串行端口关系不大,与交换数据的性质关系很大。@Commonware我希望服务响应请求,但我不确定数据更改的频率。@duffymo我不知道web套接字是如何工作的。我不是在HTTP上这样做的。“我希望服务响应请求”——您接受了一个不提供此服务的答案。您可以使用绑定服务(通过AIDL定义进程间API)或
ContentProvider
(在这里设置
query()
)来处理请求,就像REST Web服务一样,生成响应。谢谢,我将尝试一下。如果你能提供一个完整的应用程序代码示例,那将非常有帮助,因为我对android编程非常陌生。@NKR完整的应用程序不适用于这个问题。如果你刚刚开始,我建议你开始并继续关注他们,直到你有一个跑步应用程序。然后,您可以按照答案中所述添加元素,这可能是一本很好的读物。谢谢,我将查看这些链接。谢谢,我将尝试这个。如果你能提供一个完整的应用程序代码示例,那将非常有帮助,因为我对android编程非常陌生。@NKR完整的应用程序不适用于这个问题。如果你刚刚开始,我建议你开始并继续关注他们,直到你有一个跑步应用程序。然后,您可以按照答案中的描述添加元素,这可能是一本不错的读物。谢谢,我将查看这些链接。