服务使用绑定式:
有两个定义一个服务端的信使,sMessenger = new Messenger(new Handler() {});
在这个信使中获取客户端的信息,在接收的Message中获取客户端的信使cMessenger,
向客户端发送消息是通过客户端信使cMessenger来发送消息。
cMessenger.send(Message);
注意在onBind() 中返回一个IBinder对象,sMessenger.getBinder();
这个是为了客户端能够获取服务端信使sMessenger.
在ServiceConnection接口中sMessenger = new Messenger(IBinder);
这处获取的IBinder就是onBind() 中获取的IBinder对象,
在客户端就是通过获取的服务信使sMessenger来向服务端发送消息
sMessenger.send(msg);发送消息。
(1)在客户和服务端都创建一个自己的信使,
客户创建一个cMessenger , 服务创建一个sMessenger
(2)通过方法获取一个对方的信使,
在客户端通过ServiceConnection中获取sMessenger
在服务端通过获取的cMessenger = Message.reply
(3)通过对方信使向对方发送消息
客户端:sMessenger.send(msg);
服务端:cMessenger.send(msg);
public class MyService extendsService {
public Messenger sMessenger = new Messenger(newHandler(){public voidhandleMessage(android.os.Message msg) {if(msg.what == 1){int age =msg.arg1 ;
String name=(String)msg.obj;//获取客户端信使
cMessenger =msg.replyTo;//通过消息获取客户信息
Log.i("tag", name+"--->"+age);
Message reply=Message.obtain();
reply.arg1= 1234;
reply.obj= name+">>>>"+"roise";try {//通过客户端信使向客户发送消息
cMessenger.send(reply);
}catch(RemoteException e) {
e.printStackTrace();
}
}
};
});public voidonCreate() {
Log.i("tag", "ServiceonCreate()");
};
@OverridepublicIBinder onBind(Intent intent) {
Log.i("tag", "onBind()");//通过服务的信使获取IBinder
returnsMessenger.getBinder();
}
@Overridepublic booleanonUnbind(Intent intent) {
Log.i("tag", "onUnbind()");return super.onUnbind(intent);
}
@Overridepublic voidonDestroy() {
Log.i("tag", "Serviceondestroy");super.onDestroy();
}
}
public class MainActivity extendsActivity {
Messenger sMessenger;
Messenger cMessenger= new Messenger(newHandler(){public voidhandleMessage(android.os.Message msg) {//获取服务短消息
String info =(String)msg.obj;int age =msg.arg1;
Log.i("tag", "客户端接收到的消息"+info+age);
};
});
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}protected voidonStart() {super.onStart();
Log.i("tag", "ActivityonStart()");
Intent intent= new Intent(MainActivity.this, MyService.class);
bindService(intent, conn, BIND_AUTO_CREATE);
};protected voidonDestroy() {
Log.i("tag", "ActivityunbindService()");super.onDestroy();
unbindService(conn);
};public voidonSend(View v) {
Message msg=Message.obtain();
msg.arg1= 12;
msg.obj= "client";
//为了双向通信,将客户端信使发送给对方
msg.replyTo=cMessenger;
msg.what= 1;try{
sMessenger.send(msg);
}catch(RemoteException e) {
e.printStackTrace();
}
}
ServiceConnection conn= newServiceConnection() {
@Overridepublic voidonServiceDisconnected(ComponentName name) {
}
@Overridepublic voidonServiceConnected(ComponentName name, IBinder service) {
//通过ServiceConnection获取服务信使
sMessenger= newMessenger(service);
}
};
}