博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android IPC机制(二)用Messenger进行进程间通信
阅读量:7226 次
发布时间:2019-06-29

本文共 3332 字,大约阅读时间需要 11 分钟。

Messenger可以在不同进程中传递Message对象,我们在Message中加入我们想要传的数据就可以在进程间的进行数据传递了。Messenger是一种轻量级的IPC方案并对AIDL 进行了封装,它实现起来比较容易,下面我们来看看如何实现。

首先我们先写服务端(MessengerService.java),在onBind方法中创建Messenger,关联接收消息的Handler调用getBinder来获取Binder对象,在handleMessage方法中接收客户端发来的信息。

服务端(MessengerService.java): 在handleMessage回调中收到客户端信息时,我们调用Message.replyTo得到客户端传过来的Messenger对象,创建消息并通过Messenger发送给客户端。

public class MessengerService extends Service {    public static final String TAG = "MoonMessenger";    public static final int MSG_FROMCLIENT=1000;    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            switch (msg.what) {                case MSG_FROMCLIENT:                    Log.i(TAG,"服务端收到的信息-------"+msg.getData().get("msg"));                    //得到客户端传来的Messenger对象                    Messenger mMessenger=msg.replyTo;                    Message mMessage=Message.obtain(null,MessengerService.MSG_FROMCLIENT);                    Bundle mBundle=new Bundle();                    mBundle.putString("rep","这里是服务端,我们收到信息了");                    mMessage.setData(mBundle);                    try {                        mMessenger.send(mMessage);                    } catch (RemoteException e) {                        e.printStackTrace();                    }                    break;            }        }    };    @Override    public IBinder onBind(Intent intent) {        Messenger mMessenger=new Messenger(mHandler);        return mMessenger.getBinder();    }}

客户端(MessengerActivity.java),客户端需要创建一个Handler来接收服务端的信息,前面我们在服务端调用Message.replyTo得到客户端传过来的Messenger对象,可是客户端并没有传送Messenger对象啊,现在我们加上这段代码将Messenger对象传给服务端,当然需要关联我们定义的Handler。

public class MessengerActivity extends AppCompatActivity {    private Messenger mMessenger;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_messenger);        Intent intent=new Intent(MessengerActivity.this,MessengerService.class);        bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);    }    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            switch (msg.what){                case MessengerService.MSG_FROMCLIENT:                    Log.i(MessengerService.TAG, "客户端收到的信息-------" + msg.getData().get("rep"));                    break;            }        }    };private ServiceConnection mServiceConnection=new ServiceConnection() {    @Override    public void onServiceConnected(ComponentName name, IBinder service) {        mMessenger=new Messenger(service);        Message mMessage=Message.obtain(null,MessengerService.MSG_FROMCLIENT);        Bundle mBundle=new Bundle();        mBundle.putString("msg", "这里是客户端,收到了嘛服务端");        mMessage.setData(mBundle);        //将Messenger传递给服务端        mMessage.replyTo=new Messenger(mHandler);        try {            mMessenger.send(mMessage);        } catch (RemoteException e) {            e.printStackTrace();        }    }    @Override    public void onServiceDisconnected(ComponentName name) {    }};    @Override    protected void onDestroy() {        super.onDestroy();        unbindService(mServiceConnection);    }}

当然别忘了注册servce时要另开一个进程:

   

运行代码查看Log,大功告成。 

这里写图片描述

 

转载于:https://www.cnblogs.com/ganchuanpu/p/9287655.html

你可能感兴趣的文章
dubbo源码分析系列——dubbo的SPI机制源码分析
查看>>
表格单元格td设置宽度无效的解决办法
查看>>
防止视频资源被下载
查看>>
都是并发惹的祸
查看>>
eclipse实现JavaWeb项目 增量打包
查看>>
面试题系列一之 程序生命周期
查看>>
设计模式——观察者模式:气象监测应用
查看>>
NSUserDefaults简介及如何使用 NSUserDefaults 存储自定义对象
查看>>
IntelliJ IDEA搭建SpringBoot
查看>>
深入浅出iOS事件机制
查看>>
hadoop理解
查看>>
Oracle——18用户、角色和权限信息的视图总结
查看>>
WordPress 中的 Debug 模式(调试模式)
查看>>
node下使用express框架,ejs模板引擎
查看>>
搜索:文本的匹配算法
查看>>
Fedora 17 LibreOffice 办公套件的安装与汉化
查看>>
scrollview不充满屏幕的原因
查看>>
PHP单例模式
查看>>
解密敏捷自动化测试
查看>>
DelphiMVC拦截器介绍
查看>>