【问题标题】:Android best way to have a broadcast receiver communicate with a service and an activity communicate with the serviceAndroid让广播接收器与服务通信以及活动与服务通信的最佳方式
【发布时间】:2016-07-27 12:42:32
【问题描述】:

在我的 android 应用程序中,我有一个广播接收器,用于侦听网络相关意图 (android.net.conn.CONNECTIVITY_CHANGE)。 每当网络连接发生变化时,广播接收器都会收到意图,并且需要将新的连接状态传递给服务。该服务跟踪设备的连接状态。 接下来我有一个必须与服务通信以查找设备的连接状态并根据连接状态执行一些操作的活动。 处理与广播接收器与服务的通信以及接下来与服务的活动的最佳方式是什么。

【问题讨论】:

    标签: android android-intent android-activity broadcastreceiver android-service


    【解决方案1】:

    有很多方法可以做到这一点,没有“最好的方法”。这完全取决于这些组件之间正在进行的其他通信。

    Activity 可以在startService() 上使用Intent 中的附加功能将数据发送到Service

    Service 可以在startActivity() 上使用Intent 中的附加功能将数据发送到Activity

    Service 可以在广播Intent 中使用附加组件向任何组件发送数据。其他组件(活动、广播接收器等)可以注册BroadcastReceivers 来监听来自Service 的数据。

    Activity 也可以绑定到Service,这将允许ActivityService 之间使用方法调用(AIDL)进行双向通信。这些方法调用可以是同步的也可以是异步的。

    如果组件都在同一个进程中运行,您可以将状态存储在static 变量中并以这种方式共享数据。

    您需要查看整个应用程序并查看需要从组件移动到组件的数据,然后选择满足这些要求的方法。

    【讨论】:

    • 如果它们在同一个进程中,通过静态变量共享数据是否安全?我的意思是,通常这是一种开销绝对较少的方式,通常总是有效的。虽然当然不利于测试等。我发现实际上没有一种方法特别好。顺便说一句,可观察模式怎么样?
    • 如果我没有手动更改服务,是否可以安全地假设该服务与应用程序的其余部分使用相同的进程?
    • @einUsername 是的。如果您没有明确(在 <service> 的清单声明中)声明 Service 应该在另一个进程中运行,它将与其他组件在同一进程中运行(ActivityBroadcastReceiver、@987654342 @)。默认行为是所有组件在单个操作系统进程中运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多