与Service通信的简单总结

为了方便描述,以下用“服务端”代表Service,用“客户端”代表启动Service的一端。与Service通信的方法有很多种,比如:.

  1. 直接启动Service,通过Intent传入参数。
  2. 通过Binder绑定Service进行直接通信,绑定Service也有三种不同的实现分别用于不同的场景

    * 实现一:如果服务只在自己的程序里用,并且在同一个进程中,那么可以通过在Service里扩展Binder类并提供相关接口,这样当客户端首次和服务端绑定时,服务端可以通过onBind获取我们扩展的这个Binder类给客户端。一种比较常见的做法是在扩展的Binder类中编写一个方法获取当前的Service实例,这样客户端绑定服务拿到Binder后就可以通过这个方法获取Service实例从而可以访问到Service的公共方法、字段等等,达到通信的目的。

    * 实现二:不过如果服务想要给程序的其它进程使用或要给其它程序使用就不能用实现一了,因为实现一的实现是进程内的通信,而非进程间通信。如果要进程间通信,要进行比较复杂的流程,所以安卓给我们提供了Messenger,让我们更加简单快捷地实现进程间的通信。Messenger的作用,顾名思义,送信人,送什么信呢?送的是handler中的message!我们可以服务端和客户端各创建一个handler,分别处理来自对方的message,达到通信的目的。在服务绑定的时候,客户端可以获取服务端的Messenger,通过这个Messenger,可以由客户端发送message给服务端,也正因为有这个Messenger,我们可以在客户端创建一个自己的Messenger,通过服务端的Messenger发送给服务端,这样服务端也可以通过这个Messenger发送message给客户端,这样双方的通信就打通了。基于这种实现Messenger会把所有的请求放入一个独立进程中的队列,这样你就不一定非要把服务设计为线程安全的模式了,这在绝大多数场景来说是适用的且有益的。但是如果服务端需要进行并发处理,这种实现就不适用了。

    * 实现三:基于AIDL实现进程通信,这种方式的实现是安卓在你自己的进程中内部维护一个线程池,分配的远程进程的调用在线程池中处理,所以AIDL接口的实现必须要自己保证线程安全。具体实现参考谷歌的文档。

时间: 2024-10-13 19:05:35

与Service通信的简单总结的相关文章

Android之Service通信

一.本地Service通信 LocalService /** * Created by lsj on 2015/8/29. * 这是一个LocalService */ public class StrReplaceService extends Service { private final String TAG="StrReplaceService" ; public class MyBinder extends Binder{ public StrReplaceService ge

【学习笔记】Android中Service通信

一.Service的生命周期(onCreate onStart onDestroy onBind ) 1). 被启动的服务的生命周期:如果一个Service被某个Activity 调用 Context.startService 方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都在后台运行.如果一个Service被startService 方法多次启动,那么onCreate方法只会调用一次,onStart

IIS 为应用程序池提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误的解决方法

系统环境:Windows Server 2008 R2 64位, IIS 7.0 错误信息: 为应用程序池提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误.该进程ID为. 应用程序池将被自动禁用,原因是为此应用程序池提供服务的进程中出现一系列错误. 导致网站不能访问,出现 503 错误,服务不可用,Service Unavailable. 解决的方法: 1. 将应用程序池设置为 经典 Classic 模式(如果是纯.NET应用,此步骤可

C#通信之Socket通信的简单例子

socket通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过”套接字”向网络发出请求或者应答网络请求. 这里构建一个简单的例子,客户端发消息,服务端接收,然后回执一条消息.大致能够了解如何使用Socket进行通信. 服务端监听,接收信息: 客户端连接,并发送信息: 使用Socket通信,程序一般会在幕后运行,然后再合适的时间提示信息.这很自然的就会涉及到多线程的问题.在这个例子中因为每个连接都要创建一 个线程,所以需要对线程进行管理.这里我使用了两个类:Conn

(转)winform下TCP通信的简单应用

本文转载自:http://blog.csdn.net/wanlong360599336/article/details/7557064 先看效果图: TCP比较繁琐的就是三次握手定理,每次再发送数据前都要先建立连接确认. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; us

(转)winform下UPD通信的简单应用

本文转载自:http://blog.csdn.net/wanlong360599336/article/details/7557046 先看效果图: 使用UDP的好处就是不需要三次握手,但是缺点就是存在安全隐患. QQ就是利用UDP来传输数据的. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Sy

为应用程序池“XX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误

场景 WCF应用程序部署在IIS7中,使用net.tcp协议对外给几百台客户端提供服务,应用程序池不断崩溃重启. 分析过程 在事件查看器中看到的错误信息类似于 为应用程序池"XX"提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误 使用windbg在崩溃时进行分析,找到引发崩溃的堆栈的最顶部信息进行搜索,找到两个补丁包安装上 用于搜索的顶部异常信息为:IOCompletionThunk.UnhandledExceptionFra

linux下java程序与C语言程序通过SOCKET通信的简单例子

linux下java程序与C语言程序通过SOCKET通信的简单例子 今天上午实验了java程序与c语言程序通过socket进行通信.由于没学过java,因此只是编写了C语言端的代码,java端的代码是从网上别的文章中找的,经过少量修改后与C语言端程序通信成功. 本例中C语言端作为服务器,java端作为客户端 代码如下: /****************** server program *****************/ #include <stdio.h> #include <sy

Activity与Service通信(不同进程之间)

使用Messenger 上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger. 其实实现IPC(Inter-Process Communication,进程间通信)的方式,还有AIDL,但推荐使用Messenger,有两点好处: 1. 使用Messenger方式比使用AIDL的方式,实现起来要简单很多 2. 使用Messenger时,所有从Activity传过来的消息都会排在一个队列里,不会同时请求Service,所以是线程安全的.如果你的