Android 通过messenger实现跨进程通讯

Messenger的使用和

messenger可以看作是通道。。。。

多说无益,上代码,这里实现的是Activity和service的跨进程通信

首先是service代码:

public class MyService extends Service {

    private static final String TAG= "MessengerService";
    private Messenger messenger ;

    private static class Messengerhandler extends Handler {
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what) {
                case 1:{
                    Log.d(TAG,"从客户端来的消息:"+msg.getData().getString("msg"));
                    Messenger messenger_reply = msg.replyTo;
                    Message message_reply = new Message();
                    message_reply.what = 2;
                    Bundle bundle_reply = new Bundle();
                    bundle_reply.putString("reply","这是来自MyService的回信");
                    message_reply.setData(bundle_reply);

                    try {
                        messenger_reply.send(message_reply);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                    break;
                }
            }
        }
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        messenger = new Messenger(new Messengerhandler());
        return messenger.getBinder();
    }
}

  • 代码解析
    messenger发挥作用还得看handler。。。handler里要处理从activity发送过来的信息。通过getData().getString()就可以得到想要的数据。。这里的代码还实现了回复功能,关键在于msg.replyTo。。。这个replyTo是在MainActivity那里设定的。通过他我们可以确定返回message的目的地。。。

MainActivity代码

public class MainActivity extends AppCompatActivity {

    private Button button;
    private static String TAG = "MainActivity";
    private Messenger messenger;
    private Messenger messenger_getReply;


    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            messenger = new Messenger(service);
            Message msg = Message.obtain(null,1);
            Bundle data = new Bundle();
            data.putString("msg","这是客户端发送的message");
            msg.setData(data);
            msg.replyTo = messenger_getReply;
            try {
                messenger.send(msg);
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        messenger_getReply = new Messenger(new MessengergetReplyHandler());


        button = findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,MyService.class);
                bindService(intent,connection,BIND_AUTO_CREATE);
            }
        });

    }
}

MessengergetReplyHandler代码

class MessengergetReplyHandler extends Handler {
    @Override
    public void handleMessage(@NonNull Message msg) {
        switch (msg.what){
            case 2:{
                Log.d("ReplyMessenger","这是从service返回的msg:"+msg.getData().getString("reply"));
                break;
            }
        }
    }
}

  • 总结:
    Messenger传输的是message数据,对msg起反应的是Handler,使用很方便。。而且messenger处理数据是串行的,不用担心并行可能带来的错误。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值