【问题标题】:Android two-way service communication [closed]Android双向服务通信[关闭]
【发布时间】:2015-05-12 09:29:12
【问题描述】:

我有一个活动和一个本地绑定服务。我已经启动了绑定服务并且运行良好,所以我可以通过服务器/绑定器接口上的函数处理从客户端到服务器的通信。

但是我需要双向通信,服务在某些时候需要通知活动(和用户)发生了某事,并且需要在继续之前等待用户操作。换句话说,我需要服务器对客户端的调用是同步的或阻塞的。 IE。当服务调用一个函数时,它会将一些参数传递给客户端,这将触发一个 AlertDialog 供用户使用,它们的选项将确定返回给服务的返回状态代码。在此之前,我希望服务暂停并等待它收到响应,然后确定它从那里做什么(服务继续运行,服务关闭等)

那么 Android 中有没有办法做到这一点?我需要获取对我的活动的引用,它还需要公开这些阻塞方法,以便我可以从服务中调用它们,然后等待响应。我为我的客户活动提供了一个界面,但我正在努力解决如何将其转移到服务中。我不想使用序列化并将引用添加为 Intent extra,因为客户端和服务都有许多我不想序列化的成员。

谢谢。

【问题讨论】:

  • 你有“绑定本地服务”对吗?然后将回调接口传递给服务,它可以稍后调用该接口的某些方法
  • 请更具体!如何将接口传递给服务?作为可序列化的意图额外?如果是这样,那么我们已经就最后一个问题进行了讨论,这不是解决方案
  • 不,没有额外的,只是传递你的接口的引用
  • 您仍然没有具体,我的意思是请发布一些代码。我在哪里传递这个引用,我无法访问构造函数。
  • 好的,请阅读:developer.android.com/guide/components/… 您是否看到/** method for clients */ 以及您的活动可以调用的一种方法:public int getRandomNumber()?然后添加另一个名为 public void registerCallback(MyCallback callback) 的方法并从您的活动中调用它

标签: java android android-activity service


【解决方案1】:
  1. 您可以使用BroadCasts 将信息从服务发送到活动。
  2. 在Activity类中每次调用startService()只会调用服务类的onStartCommand()方法,所以你可以在Intent中向它发送消息。
  3. 使用Service binding 进行您自己的信息传输。

【讨论】:

  • 2 在这种情况下实际上并不可行,因为我需要序列化对我的活动及其包含的每个对象成员的引用。我已经使用 3 与服务进行通信,我不确定让活动也充当服务是否有意义,所以我有两个服务通信,这是否可能? 1 可能是我目前看到的最可行的选项,实际上只是遇到了这个解决方案:markhneedham.com/blog/2012/01/05/…
  • 您可以将您的活动放入Intent 中,就像使用接口实现的here 一样。这样您就可以将活动引用放入startService()
  • 这似乎很有希望,但它似乎要求对象可序列化,但我不想这样做,因为它包含我无法序列化的对象(WifiManager)
  • 序列化需要保存在 String 中,但 Intent 中不需要这样做。试试吧。
  • 我确实尝试过,即使没有使用“putSerializable”,我也使用了 putExtras,但由于缺少 Serializable,它仍然抛出错误
猜你喜欢
  • 2020-11-18
  • 2012-12-04
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多