bound服务是客户端-服务器模式的服务。
bound服务的创建方式之一:
创建一个支持绑定的服务时,你必须提供一个 IBinder,用作客户端和服务间进行通信的编程接口
使用Messenger定义该接口:
如果你需要接口跨越多个进程进行工作,可以通过Messenger来为服务创建接口。在这种方式下,服务定义一个响应各类消息对象Message的Handler。此Handler是Messenger与客户端共享同一个IBinder的基础,它使得客户端可以用消息对象Message向服务发送指令。此外,客户端还可以定义自己的Message,以便服务能够往回发送消息。
简单的说,就是服务和客户端都要有自己的Messenger,然后通过handler处理各自Messenger发送的message消息。(客户端和服务相互响应的原理)。
public class MessageService extends Service{
//本例的Service在声明时必须对外开放,即android:exported="true"。
//Messenger通信是不支持多线程的,要用到多线程就该换成AIDL通信
public static final int WHAT_1=1;
Messenger client_messenger;
@Override
public void onCreate() {
super.onCreate();
}
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
public void onDestroy() {
super.onDestroy();
}
//通过handler创建一个messenger,Messenger实质是对handler的引用
final Messenger messenger=new Messenger(new MessageHandler());
//定义一个handler子类。用于接受message对象
class MessageHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case WHAT_1:
client_messenger=msg.replyTo;//接受到传递过来的,客户端的Messsenger. 通过该Messenger发送消息到客户端
break;
default:
super.handleMessage(msg);
}
}
}
//发送客户端要处理的message
public void sendClientMessage(){
Message message=Message.obtain(null, MessageActivity.CLIENT_WAHT, null);
try {
client_messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
public class MessageActivity extends Activity {
//Service的Messenger对象
Messenger service_messenger=null;
//客户端的Messenger对象
Messenger client_messenger=new Messenger(new ClientHandler());
boolean isBound;
Message message;
final static int CLIENT_WAHT=2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//绑定和解绑Service都是按需求而定的,说白了,哪里要用,就在那里绑定(或者解绑)。
protected void onStart() {
Intent intent=new Intent(this,MessageService.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);//通过绑定方式开启服务
super.onStart();
}
protected void onStop() {
//解除绑定
if(isBound){
unbindService(connection);
}
super.onStop();
}
public void sendServiceMessage(){
if(isBound){
return ;
}
String content="Messenger方式解决当前service要被其他运用程序调用或者要跨多个进程间的通信";
message=Message.obtain(null, MessageService.WHAT_1 ,null);
message.obj=content;
message.replyTo=client_messenger; //将客户端的Messenger传递到Service中。不需要Service响应,则不需要写这行代码
//在Service里将通过客户端的Messenger发送消息到对应的客户端,然后进行处理( Service 响应客户端的原理 )
try {
service_messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
ServiceConnection connection=new ServiceConnection() {
//与服务连接发生中断时(比如service崩溃或者被系统杀死)会被调用
//注意点:activity解除绑定不会调用
public void onServiceDisconnected(ComponentName arg0) {
isBound=false;
service_messenger=null;
}
//当与service绑定时会调用。 通过Messenger与Service进行通信
public void onServiceConnected(ComponentName className, IBinder ibinder) {
isBound=true;
service_messenger=new Messenger(ibinder); //获取到Service中的Messenger对象
}
};
//用于处理Service传递的信息
class ClientHandler extends Handler{
public void handleMessage(Message msg) {
switch (msg.what) {
case CLIENT_WAHT:
//需求而定,执行操作
break;
default:
super.handleMessage(msg);
}
}
}
}