码迷,mamicode.com
首页 > 移动开发 > 详细

Android的IPC方式

时间:2016-05-07 11:30:36      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

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进行绑定就大功告成了。

Android的IPC方式

标签:

原文地址:http://blog.csdn.net/u012834186/article/details/51331169

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!