Android上的服务和活动之间的通信

时间:2013-02-04 12:28:05

标签: android service android-activity

在Android上的Activity和Service之间进行通信的方法是什么?

今天我学会了如何通过从Activity发送Intent并使用BroadcastRecevier回复来进行通信。

我还有哪些其他选择?有没有人有关于此的教程/参考?

回答这个问题是:

活动与服务进行通信的方式有多种,反之亦然。本节讨论了不同的方式,并给出了使用的建议。

5.1。活动绑定到本地服务 如果在与Activity相同的进程中启动Service,则Activity可以直接绑定到该服务。这是一种相对简单而有效的沟通方式。

5.2。使用接收器 您还可以使用动态注册的接收器进行通信。例如,您的活动可以动态注册接收者,服务会发出相应的事件。

5.3。 AIDL用于不同流程的服务 要绑定到在不同进程中运行的服务,您需要使用进程间通信(IPC),因为需要在不同进程之间发送数据。为此,您需要创建一个类似于Java接口的AIDL文件,但以.aidl文件扩展名结尾,并且只允许扩展其他AIDL文件。

如果您的服务应该提供给其他应用程序,则需要此方法,否则您应该更喜欢本地服务。

5.4。发送Intent数据并捆绑到服务 该服务从起始Android组件接收数据,并可以使用此数据。

5.5。处理程序和信使 如果服务应该回传给活动,它可以通过从活动接收的Intent数据接收Messenger类型的对象。如果Messenger绑定到活动中的Handler,则服务可以将Message类型的对象发送到活动。

Messenger是可分区的,这意味着它可以传递给另一个进程,您可以使用此对象将消息发送到活动中的处理程序。

Messenger还提供了方法getBinder(),它允许将Messenger传递给活动。因此,活动可以将消息发送到服务。

感谢http://www.vogella.com/articles/AndroidServices/article.html

2 个答案:

答案 0 :(得分:4)

将活动与服务联系起来的方式:

  1. 广播:最简单的方法,在每个广告中实施BroadcastReciever来聆听他人的行为。

  2. Messengers:非常适合多种类型的客户端,服务和客户端都有Messenger,服务在onBind()中提供Messenger,客户端发送带有自己的信使的注册/取消注册消息在replyTo()的消息中。服务保存客户端信使。现在两者都可以发送/接收消息。

  3. IBinder:如果您需要完整的远程IPC。使用AIDL定义服务接口,并将实现传递给onBind()中的客户端。

  4. Android online reference有解释。

答案 1 :(得分:-2)

这些家伙是对的,你应该谷歌寻求答案!

但是,我最近学会了一种将意图发送到服务的简洁方法。您只需致电startService(myIntent)即可向您的服务发送意向。如果服务未运行,则将启动该服务。如果服务正在运行,您可以对新信息做出反应。