Android IPC机制Messenger实例详解
AndroidIPC机制Messenger实例详解
前言:
Messenger可以翻译成信使,通过它可以在不同进程间传递Message对象有了它就可以轻松实现进程间的数据传递了。
Messenger使用的方法相对AIDL比较简单,它对AIDL做了一层封装是的我们不需要像采用AIDL那样去实现进程通信那么麻烦,可以看看他的源码有AIDL的迹象。
publicfinalclassMessengerimplementsParcelable{ privatefinalIMessengermTarget; publicMessenger(Handlertarget){ mTarget=target.getIMessenger(); } publicvoidsend(Messagemessage)throwsRemoteException{ mTarget.send(message); } publicIBindergetBinder(){ returnmTarget.asBinder(); } publicbooleanequals(ObjectotherObj){ if(otherObj==null){ returnfalse; } try{ returnmTarget.asBinder().equals(((Messenger)otherObj) .mTarget.asBinder()); }catch(ClassCastExceptione){ } returnfalse; } publicinthashCode(){ returnmTarget.asBinder().hashCode(); } publicintdescribeContents(){ return0; } publicvoidwriteToParcel(Parcelout,intflags){ out.writeStrongBinder(mTarget.asBinder()); } publicstaticfinalParcelable.CreatorCREATOR =newParcelable.Creator (){ publicMessengercreateFromParcel(Parcelin){ IBindertarget=in.readStrongBinder(); returntarget!=null?newMessenger(target):null; } publicMessenger[]newArray(intsize){ returnnewMessenger[size]; } }; publicstaticvoidwriteMessengerOrNullToParcel(Messengermessenger, Parcelout){ out.writeStrongBinder(messenger!=null?messenger.mTarget.asBinder() :null); } publicstaticMessengerreadMessengerOrNullFromParcel(Parcelin){ IBinderb=in.readStrongBinder(); returnb!=null?newMessenger(b):null; } publicMessenger(IBindertarget){ mTarget=IMessenger.Stub.asInterface(target); } }
首先我们需要新建一个Service来处理客户端的请求,同时声明一个Handler作为参数来创建一个Messenger,然后通过getBinder()方法返回Binder。
publicclassMessageServiceextendsService{ privateMessengermMessenger=newMessenger(newHandler(){ @Override publicvoidhandleMessage(MessagemsgFromClient){ super.handleMessage(msgFromClient); MessagemsgToTarget=Message.obtain(msgFromClient); msgToTarget.what=0; try{ Thread.sleep(2000); msgToTarget.arg1=msgFromClient.arg1+msgFromClient.arg2; msgFromClient.replyTo.send(msgToTarget); }catch(InterruptedExceptione){ e.printStackTrace(); }catch(RemoteExceptione){ e.printStackTrace(); } } }); @Nullable @Override publicIBinderonBind(Intentintent){ returnmMessenger.getBinder(); } }
里面的逻辑是简单的将客户端传来的Message中的arg1和arg2的值相加并将结果返回给Message对应的replyTo这个Messenger,并通过send将服务端的Message返回给客户端。
然后在客户端处理:首先需要bindService来绑定这个Service,然后通过IBinder生成一个Messenger对象,这个Messenger对象就可以将需要处理的数据封装到Message然后send到Service去。
MessengermMessenger=newMessenger(newHandler(){ @Override publicvoidhandleMessage(Messagemsg){ super.handleMessage(msg); Log.w("Jayuchou","---从异步线程中读取到数据---"+msg.arg1); } }); MessengermService; ServiceConnectionconnection=newServiceConnection(){ @Override publicvoidonServiceConnected(ComponentNamename,IBinderservice){ mService=newMessenger(service); Log.w("Jayuchou","--Connectedsuccess--"); } @Override publicvoidonServiceDisconnected(ComponentNamename){ Log.w("Jayuchou","--Connecteddismiss--"); mService=null; } };
然后调用的地方方式为:
MessagemsgFromClient=Message.obtain(null,0,1,2); msgFromClient.replyTo=mMessenger; try{ mService.send(msgFromClient); }catch(RemoteExceptione){ e.printStackTrace(); }
将数据封装Message中,并且Message中的replyTo指定服务端中要将结果回调的Messenger对象。
msgFromClient.replyTo.send(msgToTarget);
我们可以看到Service中有这么一句代码,其中的replyTo就是我们在客户端传进去的Messenger,这时候调用send方法就可以将服务端的也就是另一个进程的数据传到想要用的进程然后采用Messenger进行接收,我们可以跟Handler用法类似的使用即可。Messenger是一个轻量级的AIDL,一次一个处理请求。
以上就是Androidmessenger的消息处理的详解,关于Android开发的文章,本站还很多,请大家搜索参阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!