Android的IPC方式

来源:互联网 发布:java 菜鸟教程书籍 编辑:程序博客网 时间:2024/06/06 17:33

1,Bundle一种最简单的进程间传递数据的方式
使用Bundle在进程间传递数据(数据要被序列化,基本数据类型都实现了序列化)。

Intent intent = new Intent("romote");                    Bundle bundle=new Bundle();                    bundle.putParcelable(KEY,new Book(1,"wcx"));                    intent.putExtras(bundle);startActivity(intent);//另一个进程获取数据Book book=getIntent().getParcelableExtra(MainActivity.KEY);Log.e(LOG_TAG,book.toString());

2,通过文件共享的方式
比如把某个对象序列化到硬盘上,在另一个进程对其反序列化,获取对象的数据。
通过这种A进程写入到文件,B进程读取文件的方式,也可以实现数据共享。
但如果多进程并发的读写,会造成很大的麻烦。所以有并发的读写的操作,需要线程同步。
它适用于对数据同步要求不高之间的进程进行通信。

3,Messenger
Messenger可以在不同的进程中传递Message对象。而Message中可以放入我们需要传递的数据。
它是一种轻量级的IPC方式,它的底层是AIDL。

实现的步骤:
在远程服务中,创建Messenger对象时和一个Handler进行绑定。而此Handler负责处理客户端发送过来的消息。
在bind方法中通过getBinder(),返回Messenger中的Binder对象。

在客户端,通过绑定服务,服务连接后,获取到Binder对象,通过Binder对象,创建Messenger。
把客户端需要发送的消息封装到Message中。
Message的obj可以在同进程中传递数据,但在多进程里,obj只能指定系统提供的实现Parceable接口的对象。所以基本数据类型(实现的都是Serializable接口)都不可以。自定义的实现Parceable接口的对象也不可以。但是好在可以使用Bundle,Bundle支持所有序列化的对象。
封装数据完毕后,通过Messenger发送Message。
然后在远程服务的Handler去处理这些传递过来的数据。

远程服务:

    private static final String LOG_TAG = "====>";    @Nullable    @Override    public IBinder onBind(Intent intent) {        Log.e(LOG_TAG, "线程id:" + android.os.Process.myPid() + "");        return messenger.getBinder();    }    //handler处理客户端发送的消息    private Handler handler=new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what){                case MainActivity.CORRECT:                    String name=msg.getData().getString("football");                    Log.e(LOG_TAG,name);                    break;                default:                    Log.e(LOG_TAG, "default");                    break;            }        }    };    Messenger messenger=new Messenger(handler);

客户端:

    private void messengerMethod(){        //绑定服务        Intent intent=new Intent();        intent.setComponent(new ComponentName("asule.myhope","asule.myhope.MyMessengerService"));        bindService(intent,conn,BIND_AUTO_CREATE);    }    private ServiceConnection conn=new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            messenger = new Messenger(service);            Message message=new Message();            message.what=CORRECT;            Bundle bundle=new Bundle();            bundle.putString("football", "ronaldo");            message.setData(bundle);            try {                messenger.send(message);            } catch (RemoteException e) {                e.printStackTrace();            }        }        @Override        public void onServiceDisconnected(ComponentName name) {        }    };

上面的例子演示的是客户端发送数据到服务端。远程服务也可以通过Messenger回复客户端数据。
在客户端发送数据完毕后,通过Message.replayTo参数把客户端的Messager传递给服务端。服务端使用该Messager发送数据到客户端。
此时的客户端只需要创建Messenger,与一个处理数据的Handler进行绑定就大功告成了。

0 1
原创粉丝点击