清晰明了的使用Messenger实现进程间通信

本文详细介绍Android中使用Messenger进行跨进程通信的方法。通过示例代码展示了客户端和服务端如何建立连接、发送及接收消息。

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

      在Android开发中,相信你肯定听说过进程间通信。解决进程间的通信方式,相信你在面试的时候肯定能扯出几种方式:AIDL,Messenger,共享文件 .....blablablabla.....  但是   在Android开发的过程中很少使用到多进程吧。不常使用的东西,学会了过一段时间肯定会忘。正好,公司的一个新功能正好用到了多开一个进程,所以学习学习Messenger,记录一下。

        憋的不说,直接上代码:

        Service端的代码

public class MessengerService extends Service {
    public final static String TAG = "MessengerService";
    public final static int SERVICEID = 0x0001;
    public final static int SERVICEID3 = 0x0003;

    private Messenger  messenger = new Messenger(new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.arg1 == SERVICEID){
                //接收从客户端传来的消息
                String str = (String) msg.getData().get("msg");
                Log.d(TAG,"接收从客户端传来的消息");
                Log.d(TAG,str);

                //发送数据给客户端
                Message  msgTo = Message.obtain();
                msgTo.arg1 = 0x0002;
                Bundle bundle = new Bundle();
                bundle.putString("msg","我来自服务器的字符串");
                msgTo.setData(bundle);
                try {
                    msg.replyTo.send(msgTo);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }else if(msg.arg1 == SERVICEID3){
                String str = (String) msg.getData().get("msg");
                Log.e(TAG,str);
                Message  msgTo = Message.obtain();
                msgTo.arg1 = 0x0002;
                Bundle bundle = new Bundle();
                bundle.putString("msg","hello!我叫小白@_@");
                msgTo.setData(bundle);
                try {
                    msg.replyTo.send(msgTo);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        }
    });


    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG,"service_onCreate");

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG,"onBind");
        return messenger.getBinder();
    }

创建一个类,继承Service  并实现相应方法。创建一个Messenger对象,其中Handler作为一个参数,并且实现handleMessage方法。该方法主要是用于接收消息。

在onBind( )方法中,返回messenger.getBinder()。


      Activity客户端的代码:

public class MainActivity extends AppCompatActivity {

    private final static String TAG = "MainActivity";
    public final static int  ACTIVITYINFO = 0x0002;

    /*
    客户端的Messenger
     */
    private Messenger aMessenger = new Messenger(new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.arg1 == ACTIVITYINFO){
                //客户端接收服务器端传来的消息
                Log.d(TAG,"从服务端传来的消息");
                String  str = (String) msg.getData().get("msg");
                Log.d(TAG,str);
            }
        }
    });

    /*
    服务端传来的Messenger
     */
    Messenger sMessenger;

    ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Log.d(TAG,"onServiceConnected");
            sMessenger = new Messenger(iBinder);

            Message message = Message.obtain();
            message.arg1 = 0x0001;
            message.replyTo = aMessenger;

            Bundle bundle = new Bundle();
            bundle.putString("msg","我就是Activity传过来的字符串");
            message.setData(bundle);

            try {
                //消息从客户端发出
                sMessenger.send(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Log.d(TAG,"onServiceDisconnected");

        }
    };

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

    public  void bindService(){
        Intent service = new Intent(MainActivity.this,MessengerService.class);
        bindService(service,serviceConnection, Context.BIND_AUTO_CREATE);
    }


    public void send(View view){
        Message msg = Message.obtain();
        msg.arg1 = 0x0003;
        msg.replyTo = aMessenger;
        Bundle bundle = new Bundle();
        bundle.putString("msg","哈哈!!!我叫小明");
        msg.setData(bundle);
        try {
            sMessenger.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

创建一个ServiceConnection对象,创建一个客户端的Messenger 和 一个服务器端的Messenger。


我们来捋一下代码运行的流程:

1.客户端绑定一个Service:

public  void bindService(){
        Intent service = new Intent(MainActivity.this,MessengerService.class);
        bindService(service,serviceConnection, Context.BIND_AUTO_CREATE);
    }

2.服务端执行onBind方法,返回messenger.getBinder():

@Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG,"onBind");
        return messenger.getBinder();
    }

3.客户端的onServiceConnected方法执行:

ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Log.d(TAG,"onServiceConnected");
            sMessenger = new Messenger(iBinder);

            Message message = Message.obtain();
            message.arg1 = 0x0001;
            message.replyTo = aMessenger;

            Bundle bundle = new Bundle();
            bundle.putString("msg","我就是Activity传过来的字符串");
            message.setData(bundle);

            try {
                //消息从客户端发出
                sMessenger.send(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Log.d(TAG,"onServiceDisconnected");

        }
    };

             3.1 通过传来的参数,生成服务端的Messgener:

sMessenger = new Messenger(iBinder);

             3.2 将客户端的Messenger也绑定在Message中,准备发送到服务端:

message.replyTo = aMessenger;

             3.3 往服务端发送消息:

try {
                //消息从客户端发出
                sMessenger.send(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }

4.服务端接收到消息并发送消息给客户端:

private Messenger  messenger = new Messenger(new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.arg1 == SERVICEID){
                //接收从客户端传来的消息
                String str = (String) msg.getData().get("msg");
                Log.d(TAG,"接收从客户端传来的消息");
                Log.d(TAG,str);

                //发送数据给客户端
                Message  msgTo = Message.obtain();
                msgTo.arg1 = 0x0002;
                Bundle bundle = new Bundle();
                bundle.putString("msg","我来自服务器的字符串");
                msgTo.setData(bundle);
                try {
                    msg.replyTo.send(msgTo);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }

需要注意的一个点:发送消息给客户端使用的是msg.replyTo.send(...)。这里的msg.replyTo 和 客户端onServiceConnected方法中 绑定的 message.replyTo = aMessenger 是同一个Messenger。

5.客户端接收到消息:

/*
    客户端的Messenger
     */
    private Messenger aMessenger = new Messenger(new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.arg1 == ACTIVITYINFO){
                //客户端接收服务器端传来的消息
                Log.d(TAG,"从服务端传来的消息");
                String  str = (String) msg.getData().get("msg");
                Log.d(TAG,str);
            }
        }
    });


从上面的步骤来看得到的结论:

(1)客户端的Messenger发送的信息,客户端的handleMessage()就能接收到,服务端的Messenger发送的信息,服务端的handleMessage()就能接收到。

(2)在客户端和服务端都实现handleMessage()方法用于接收自己Messenger发送的消息。

(3)在客户端中 服务端的Messenger是在onServiceConnected( )中创建的。  服务端中 客户端的Messenger是通过Message传过去的。 msg.replyTo = aMessenger 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值