Android---IPC机制

来源:互联网 发布:淘宝文艺女装店 编辑:程序博客网 时间:2024/05/16 12:32

IPC简介

IPC —Inter-Process Communication 含义就是进程间通信,或者跨进程通信

IPC的适用场景以及优缺点

名称 有点 缺点 适用场景 Bundle 简单易用 只支持传输Bundle支持的数据类型 四大组件间的进程通信 文件共享 简单易用 不适合高并发场景,并且无法做到进程间的即是通信 无并发访问情形,交换简单的数据实时性不高的场景 AIDL 功能强大,支持一对多并发通信,支持实时通信 使用稍微复杂,需要处理好线程同步 一对多通信且有RPC需求 Messenger 功能一般,支持一对多串行通信,支持实时通信 不能很好的处理高并发情形,不支持RPC,数据通过Message进行传输,因此只能传输Bundle支持的数据类型 低并发的一对多即是通信,无RPC需求,或者无须返回结果的RPC需求 ContentProvider 在数据源访问方面功能强大,支持一对多并发数据共享,可通过Call方法扩展其他操作 可以理解为受约束的AIDL,主要提供数据源的CRUD操作 一对多的进程间的数据共享 Socket 功能强大,可以通过网络传输字节流,支持一对多并发实时通信 实现细节稍微烦琐,不支持直接的RPC 网络数据交换

IPC 基础概念

Parcelable

Android中使用Parcelable来实现序列化

AndroidStudio中使用插件来实现序列化类, 请移步

Binder

  • 从Android FrameWordk层: Binder 是ServiceManager连接各种Manager(ActivityManager, WindowManager, ……)和相应ManagerService的桥梁
  • 从Android角度: Binder是客户端和服务器端进行通信的媒介,当bindService的时候,服务器会返回一个包含了服务器端业务调用的Binder对象,通向这个Binder对象,客户端可以通过服务器端提供的服务或者数据.

Android中的ICP

1.Bundle

2.文件共享

3.Messenger (信使)

Messenger 对AIDL进行封装,底层实现还是AIDL.以串行的方式处理客户端发来的的消息,如果客户端发来大量的消息,Messenger还是一个个处理. 所以Messenger 在跨进程中最主要的作用就是传递消息,故名信使
Messenger所涉及到的就是 Message(消息),通过Handler来发送消息和接受消息.

工作原理

这里写图片描述

服务器端进程

  1. 创建一个Service,用来处理客户的的连接请求. MessengerService extend Service
  2. 创建一个Handler mHandler = new Handler();
  3. 使用mHandler 来创建一个Messenger对象, Messenger mMessenger = new Messenger(mHandler);
  4. Service 的onBind(){ return mMessenger.getBinder();}

客户端进程

  1. 绑定服务器端的Service,绑定成功,返回的IBinder对象创建一个Messenger
  2. 通过这个Messenger向服务器发送消息,类型为Message

服务器代码

public class MessengerService extends Service {    private static final String TAG = "MessengerService";    //TODO ① 创建一个Handler    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);            }        }    }  //TODO ② 使用创建的Handler 来创建 Messenger    private final Messenger mMessenger = new Messenger(new MessengerHandler());    @Override    public IBinder onBind(Intent intent) {        //TODO ③ 返回Messenger的 Binder        return mMessenger.getBinder();    }    @Override    public void onCreate() {        super.onCreate();    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        return super.onStartCommand(intent, flags, startId);    }}

客户端代码

public class MessengerActivity extends Activity {    private static final String TAG = "MessengerActivity";    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);            }        }    }    // TODO ① 绑定一个服务    private ServiceConnection mConnection = new ServiceConnection() {        public void onServiceConnected(ComponentName className, IBinder service) {            //TODO ②使用Ibinder 来创建Messenger            mService = new Messenger(service);            Log.d(TAG, "bind service");            //TODO ③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 {                //TOOD ④ Messenger.send 发送Message 到服务器                mService.send(msg);            } catch (RemoteException e) {                e.printStackTrace();            }        }        public void onServiceDisconnected(ComponentName className) {        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_messenger);        Intent intent = new Intent("com.ryg.MessengerService.launch");        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);    }    @Override    protected void onDestroy() {        unbindService(mConnection);        super.onDestroy();    }}

未完待续……….

2 0
原创粉丝点击