Messenger,信使,可使用它进行进程间的通信,而Messenger对Service的请求采用队列的方式,因此它不支持多线程通信。
看看官方文档对于Messenger的解释:
Reference to a Handler, which others can use to send messages to it. This allows for the implementation of
message-based communication across processes, by creating a Messenger pointing to a Handler in one process,
and handing that Messenger to another process.
客户端和服务端可相互持有对方的Messenger来进行通信,下面我们来看看具体的实现。
在eclipse下创建两个工程,分别为客户端和服务端:
客户端的实现,创建客户端的Messenger,使用Messenger的构造方法指向一个handler实例,此handler用于处理服务端发过来的消息。
而客户端通过onServiceConnected获得服务端的Messenger,使用此Messenger给服务端发送消息,客户端的Messenger通过Message的replyTo传递给服务端。
1publicclassMainActivityextendsActivity {23privatestaticfinalString TAG = "--DEBUG--";45//用于启动service的ACTION6privatestaticfinalString START_SERVER_ACTION = "com.young.server.START_SERVICE";7privatestaticfinalintWHAT_ON_TO_SERVICE = 1;8privatestaticfinalintWHAT_ON_TO_CLIENT = 2;910privateButton mBindBtn;11privatebooleanisBindService =false;1213@Override14protectedvoidonCreate(Bundle savedInstanceState) {15super.onCreate(savedInstanceState);16setContentView(R.layout.activity_main);17mBindBtn =(Button) findViewById(R.id.bind_service);18mBindBtn.setOnClickListener(newOnClickListener() {19@Override20publicvoidonClick(View v) {21bindService(newIntent(START_SERVER_ACTION), conn, Context.BIND_AUTO_CREATE);22}23});24}2526//client端Handler,用于处理server端发来的消息27privateHandler mClientHandler =newHandler(newCallback() {28@Override29publicbooleanhandleMessage(Message msg) {30switch(msg.what) {31caseWHAT_ON_TO_CLIENT:32Log.v(TAG, "客户端收到服务端发来的消息!");33break;3435default:36break;37}38returnfalse;39}40});4142//client端Messenger43privateMessenger mClientMessenger =newMessenger(mClientHandler);4445privateServiceConnection conn =newServiceConnection() {4647@Override48publicvoidonServiceDisconnected(ComponentName name) {49Log.v(TAG, "服务已断开");5051isBindService =false;52mClientMessenger =null;53}5455@Override56publicvoidonServiceConnected(ComponentName name, IBinder service) {57Log.v(TAG, "服务已链接");5859isBindService =true;60//获得server端信使Messenger实例61Messenger serverMessenger =newMessenger(service);62//向server端发送的消息63Message toServerMessage = Message.obtain(null, WHAT_ON_TO_SERVICE);64//通过replyTo把client端的信使传递给service65toServerMessage.replyTo =mClientMessenger;66try{67serverMessenger.send(toServerMessage);68}catch(RemoteException e) {69e.printStackTrace();70}71}72};7374protectedvoidonStop() {75if(isBindService)76unbindService(conn);77super.onStop();78};79}
服务端Service的实现,服务端接收到客户端的消息以后,通过Message的replyTo取出客户端的Messenger,使用此Messenger给客户端发送消息,这就实现了进程之间的双向通信。
服务端通过Messenger的getBinder方法将IBinder对象返给客户端,用于共享服务端的Messenger。
1publicclassRemoteServiceextendsService {2privatestaticfinalString TAG = "--DEBUG--";34privatestaticfinalintWHAT_ON_TO_SERVICE = 1;5privatestaticfinalintWHAT_ON_TO_CLIENT = 2;67//server端handler,用来处理client发来的消息8privateHandler mServerHandler =newHandler(newCallback() {9@Override10publicbooleanhandleMessage(Message msg) {11switch(msg.what) {12caseWHAT_ON_TO_SERVICE:13Log.v(TAG, "收到客户端发来的消息");14//server端获得client端的信使Messenger15Messenger clientMessenger =msg.replyTo;16Message toClientMsg = Message.obtain(null, WHAT_ON_TO_CLIENT);17try{18//使用客户端Messenger向客户端发送消息19clientMessenger.send(toClientMsg);20}catch(RemoteException e) {21e.printStackTrace();22}23break;2425default:26break;27}28returnfalse;29}30});3132//server端信使Messenger33privateMessenger mServerMessenger =newMessenger(mServerHandler);3435@Override36publicIBinder onBind(Intent intent) {37returnmServerMessenger.getBinder();38}
再来看看服务端service的声明,因为要在其他进程中启动service,所以设置android:exported为true,此外还为service加入启动了权限。
12378910
最后要在客户端添加相应的启动Service权限。