使用Messenger

来源:互联网 发布:nginx反向代理什么意思 编辑:程序博客网 时间:2024/05/18 06:21

Messenger可以翻译为“信使”,顾名思义,通过它可以再不同进程间传递数据。Mesenger其实是一种轻量级的IPC,它的底层实现就是AIDL。从构造函数就可以看出来

    public Messenger(Handler target) {        mTarget = target.getIMessenger();    }    public Messenger(IBinder target) {        mTarget = IMessenger.Stub.asInterface(target);    }

使用方法

1.服务端进程

创建一个Service处理连接请求,同时创建一个Handler来创建一个Messenger对象,然后在onBind返回这个Binder

public class MessengerService extends Service {    @Override    public IBinder onBind(Intent intent) {        return mMessenger.getBinder();    }    private static class MessengerHandler extends Handler {        @Override        public void handleMessage(Message msg) {            if (msg.what == 0x001) {                Log.i("server", msg.getData().getString("msg"));                // 回复消息给客户端                Messenger client = msg.replyTo;                Message replayMessage = Message.obtain(null, 0x002);                Bundle bundle = new Bundle();                bundle.putString("reply", "消息收到");                replayMessage.setData(bundle);                try {                    client.send(replayMessage);                } catch (RemoteException e) {                    e.printStackTrace();                }            }        }    }    private Messenger mMessenger = new Messenger(new MessengerHandler());}

2.客户端进程

首先要绑定Service,绑定成功后用返回的IBinder对象创建一个Messenger,通过这个Messenger就可以向服务端发送消息了。如果需要服务端能够回应客户端,我们还需要创建一个Handler并新创建一个Messenger,并把这个Messenger对象通过Message的replyTo函数传给服务端

public class MainActivity extends Activity {    private Messenger mService;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Intent intent = new Intent(this, MessengerService.class);        bindService(intent, connection, Context.BIND_AUTO_CREATE);    }    private ServiceConnection connection = new ServiceConnection() {        @Override        public void onServiceDisconnected(ComponentName name) {        }        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            mService = new Messenger(service);            Message message = Message.obtain(null, 0x001);            Bundle date = new Bundle();            date.putString("msg", "hello, this is client");            message.setData(date);            // 注意            message.replyTo = mGetMessenger;            try {                mService.send(message);            } catch (RemoteException e) {                e.printStackTrace();            }        }    };    protected void onDestroy() {        unbindService(connection);        super.onDestroy();    };    // 下面是客户端接收消息    private Messenger mGetMessenger = new Messenger(new MessengerGetHandler());    private static class MessengerGetHandler extends Handler {        @Override        public void handleMessage(Message msg) {            if (msg.what == 0x002) {                Log.i("client", msg.getData().getString("reply"));            }        }    }}

注册Service

<service android:name=".service.MessengerService"              android:process=":remote"></service>

这里写图片描述

这里写图片描述

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 汽车解锁换电池后没反应怎么办 包裹显示待收件人向海关申报怎么办 在越南签证被公安扣了怎么办 酷派手机收不到验证码怎么办 苹果想把图片上的字盖上怎么办 婴儿自己把眼珠子抠红了怎么办 如果美陆战队员进入台湾那怎么办? 顺产生完小孩吸不通奶怎么办 耐克空军一号白色底发黄怎么办 中行网银u盾丢了怎么办 有人用你的手机号码不停注册怎么办 获得公开你微信头像的权限是怎么办 手机能进的网站电脑进不去怎么办 苹果8p下不了微信怎么办 苹果手机版本过底不能下微信怎么办 手机打开视频跳转到qq是怎么办 淘宝店铺显示服务竟然出错了怎么办 母羊下完羊羔把羊衣吃了怎么办? 移植后56天有黑色东西怎么办 我家的金丝熊浑身都是尿怎么办 一键启动车钥匙丢了怎么办 把爷爷的遗物弄丢了怎么办 如果你娶了一个傻子你怎么办 在国外订机票手机收不到信息怎么办 网上买机票名字写错了怎么办 买机票名字错了一个字怎么办 微店没收到货却显示已收货怎么办? 手机存的照片误删了怎么办 魔兽世界把要用的装备分解了怎么办 邻居家的狗见到我就叫怎么办 我的世界玩的时间长会卡应该怎么办 网易我的世界密码账号都忘了怎么办 我的世界创建世界画面乱码了怎么办 网易我的世界云端存档不够用怎么办 玩刺激战场带耳机声音有延迟怎么办 我的世界手机版狼变色怎么办 我的世界开了光影太阳太刺眼怎么办 我的世界饥饿值掉的慢怎么办 我的世界合装备过于昂贵怎么办 我的世界故事模式屏幕是黑的怎么办 人物只剩下轮廓的图用ps怎么办