使用Bundle四大苏建中的三大组件都支持在Intent中传递Bundle数据,Bundle实现了Parcelable接口,可以方便的在不同进程间传输.
通过流来读取数据,linux系统使得并发读/写文件可以没有限制的进行. 缺点就是如果并发读写了,内容很可能就不是最新的了,因此避免并发的情况.
Messenger是一种轻量级的ipC方案,底层实现的是AIDL 特点是一次处理一个请求,在服务端不用考虑线程同步的问题. 实现一个Messenger有服务端和客户端 服务端 创建一个Service处理客户端的连接请求, 同时创建一个Handler并通过它来创建一个Messengerduixiang
public class MessengerService extends Service { PRivate static final String TAG = "MessengerService"; //处理客户端发送的消息 private static class MessengerHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MyConstants.MSG_FROM_CLIENT: Log.i(TAG, "receive msg from Client:" + msg.getData().getString("msg")); /* Messenger client = msg.replyTo; Message relpyMessage = Message.obtain(null, MyConstants.MSG_FROM_SERVICE); Bundle bundle = new Bundle(); bundle.putString("reply", "嗯,你的消息我已经收到,稍后会回复你。"); relpyMessage.setData(bundle);*/ try { client.send(relpyMessage); } catch (RemoteException e) { e.printStackTrace(); } break; default: super.handleMessage(msg); } } } //将客户端发送的消息传给MessengerHandler private final Messenger mMessenger = new Messenger(new MessengerHandler()); //返回Binder对象 @Override public IBinder onBind(Intent intent) { return mMessenger.getBinder(); }}客户端 首先绑定服务端的Service,然后在返回的IBinder对象创建一个Messenger,通过这个Messenger就可以向服务端发送消息了
private Messenger mService; private Messenger mGetReplyMessenger = new Messenger(new MessengerHandler()); private static class MessengerHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MyConstants.MSG_FROM_SERVICE: Log.i(TAG, "receive msg from Service:" + msg.getData().getString("reply")); break; default: super.handleMessage(msg); } } } private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { mService = new Messenger(service); //通过Message为载体传输 Message msg = Message.obtain(null, MyConstants.MSG_FROM_CLIENT); Bundle data = new Bundle(); data.putString("msg", "hello, this is client."); msg.setData(data); msg.replyTo = mGetReplyMessenger; try { mService.send(msg); } catch (RemoteException e) { e.printStackTrace(); } } public void onServiceDisconnected(ComponentName className) { } };服务端向客户端返回数据的时候注意: msg.replyTo=mMessenger;
缺点是本身只能串行一个一个的处理消息,如果大量的请求那么就不合适了.
底层实现也是使用Bundle,通过四大组件的ContentProvider实现跨进程通信.
Socket本身可以支持传输任意字节流,Socket是一种不错的IPC方式
新闻热点
疑难解答