IPC进程间通信:Messenger

本文深入解析了Android中Messenger服务的实现原理,展示了如何通过Messenger在Service与Activity间双向通信,包括构建Messenger对象、处理消息、回复机制等核心步骤。

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

新建service进程

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

 service代码如下

public class MessengerService extends Service {
    //
    private Messenger messenger = new Messenger(new MessengerHandler());
    //用来处理客户端发来的信息
    class MessengerHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.e("Tag" , "service revice msg.what : " + msg.what);
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
    //返回Messenger对象底层的Binder
        return messenger.getBinder();
    }
}

 客户端代码如下:

public class MainActivity extends AppCompatActivity {
    private int i = 0;
    private Messenger serverMessenger;
    //service连接对象
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.e("tag" , "onServiceConnected");
            //构建service端Messenger
            serverMessenger = new Messenger(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(this , MessengerService.class);
        //绑定service
        bindService(intent , connection , Context.BIND_AUTO_CREATE);
        
    }
    public void click(View view) {
        Message msg = Message.obtain();
        msg.what = i;
        try {
            //发送信息到服务端
            serverMessenger.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        i++;
    }
    @Override
    protected void onDestroy() {
        //解除service绑定
        unbindService(connection);
        super.onDestroy();
    }
}

 此时启动项目即可在service端收到Activity发送来的信息

接下里准备在service中收到信息后回复Activity

可以发现在Message中replyTo属性类型为Messenger,这就是用来做返回用的

我们可以在Activity中创建一个Messenger,并且在发送Message到Service时,在Message中将Activity创建的Messenger放入发送的Message.replyTo中,之后便可在service中取出,再用其返回数据给Activity。

修改Activity代码,添加Messenger:

    private Messenger serverMessenger,clientMessenger;
    
    //用来操作service返回的数据
    private static class ClientHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.e("tag" , "client revice msg.what :" + msg.what);
        }
    }
    
    public void click(View view) {
        Message msg = Message.obtain();
        //将Messenger放入要发送的信息中
        msg.replyTo = clientMessenger;
        msg.what = i;
        try {
            serverMessenger.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        i++;
    }

 修改service代码,取出Message中Activity发来的Messenger,用其便可回复Activity:

//Activity发送过来的Messenger    
private Messenger clientMessenger;
//用来处理Activity发送来的信息
    class MessengerHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.e("Tag" , "service revice msg.what : " + msg.what);
            //取出客服端发送过来的Messenger
            if(msg.replyTo != null){
                clientMessenger = msg.replyTo;
            }
            //新建回复消息
            Message retMsg = Message.obtain();
            retMsg.what = msg.what + 100000;
            try {
                //回复Activity
                clientMessenger.send(retMsg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    }

 运行程序即可在service中收到Activity发送来的信息,且可在Activity中收到service回复的信息

完整Activity代码如下:

public class MainActivity extends AppCompatActivity {
    private int i = 0;
    private Messenger serverMessenger,clientMessenger;
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.e("tag" , "onServiceConnected");
            serverMessenger = new Messenger(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @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);
        clientMessenger = new Messenger(new ClientHandler());
    }

    public void click(View view) {
        Message msg = Message.obtain();
        msg.replyTo = clientMessenger;
        msg.what = i;
        try {
            serverMessenger.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        i++;
    }

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

    private static class ClientHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.e("tag" , "client revice msg.what :" + msg.what);
        }
    }

}

完整service代码如下:

public class MessengerService extends Service {

    private Messenger messenger = new Messenger(new MessengerHandler());
    private Messenger clientMessenger;
    class MessengerHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.e("Tag" , "service revice msg.what : " + msg.what);
            if(msg.replyTo != null){
                clientMessenger = msg.replyTo;
            }
            Message retMsg = Message.obtain();
            retMsg.what = msg.what + 100000;
            try {
                clientMessenger.send(retMsg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值