RemoteService中的 Messenger信使

本文介绍如何使用Messenger实现Android应用间通信。通过示例代码展示了服务端与客户端如何建立连接并发送消息,包括消息的封装与解析过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.app服务端


MessageService.java

public class MessageService extends Service {

    /**
     * 用于接收其他应用程序传递过来的消息,
     * 信使可以封装Handler, 封装之后就可以接收数据
     */
    private Handler mReceiveHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            int what = msg.what;
            switch (what) {
                case 998: // 打印数据
                    // !!! 如果Handler用于信使的消息接收,
                    //     那么 obj 对象必须是 Parcelable对象 !!!
                    Object obj = msg.obj;
                    Log.d("Service", "obj = " + obj);

                    if (obj instanceof Bundle) {
                        Bundle bundle = (Bundle) obj;
                        int id = bundle.getInt("id");
                        Log.d("Service", "id = " + id);
                    }

                    Messenger replyTo = msg.replyTo;
                    if (replyTo != null) {
                        // 消息处理完成,需要返回结果和状态
                        Message message = Message.obtain();
                        message.what = 777;
                        try {
                            replyTo.send(message);
                        } catch (RemoteException e) {
                            e.printStackTrace();
                        }
                    }

                    break;
            }
        }
    };

    public MessageService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // 使用信使 Messenger 来返回就可以了
        return new Messenger(mReceiveHandler).getBinder();
    }
}

2.messengerclient应用程序


MainActivity.java

public class MainActivity extends AppCompatActivity implements ServiceConnection {
    // 发送消息用的
    private Messenger mSendMessenger;

    private Handler mReceiveHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            int what = msg.what;
            Toast.makeText(MainActivity.this, "结果: " + what, Toast.LENGTH_SHORT).show();
        }
    };

    // 等待服务返回数据,接收
    private Messenger mReplyMessenger;

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

        mReplyMessenger = new Messenger(mReceiveHandler);

        // 绑定远程服务
        Intent intent = new Intent();
        intent.setClassName(
                "mobi.vhly.messengerdemo",  // 程序ID
                "mobi.vhly.messengerdemo.services.MessageService" // 服务类全名
        );
        bindService(intent, this, BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        unbindService(this);
        super.onDestroy();
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // 绑定的服务使用信使来返回 IBinder对象;
        // 接收到IBinder对象,可以使用 Messenger信使封装, 就可以发送消息了
        mSendMessenger = new Messenger(service);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mSendMessenger = null;
    }

    public void btnSendMessage(View view) {
        if (mSendMessenger != null) {
            Message msg = Message.obtain();
            msg.what = 998;
            msg.arg1 = 999;
            // 使用信使发送的必须是Parcelable接口的对象,不能够是基本数据类型
            Bundle bundle = new Bundle();
            bundle.putInt("id", 6);
            msg.obj = bundle;

            // 消息可以设置 replyTo 成员,实现 A -> B ,B收到之后,通过 replyTo对象,可以
            // 把数据返回给 A
            msg.replyTo = mReplyMessenger; // 用于接收消息

            // 使用信使发送消息
            try {
                mSendMessenger.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    }
}
使用Messenger信使来实现两个application的通信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值