Android IPC 进程间通信机制之 Messenger

Messenger 作为一个跨进程通信工具,它可以让你通过互相传递 Message 来进行跨进程数据交互共享。对于Android来说,Messenger是一个轻

量级的 IPC 方案,内部对 AIDL 进行了封装。它的实现较之 AIDL 方式也更为容易。

1、创建我们的服务端 WorkService :

import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;

public class WorkService extends Service {
    
    public static final int MSG_FROM_CLIENT = 101;

    private Handler workHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case MSG_FROM_CLIENT:

                    Bundle bundle = msg.getData();
                    //打印接收到的客户端信息
                    Log.d("RJie", "WorkService: " + bundle.getString("msg"));
                    //通过 msg 的 msg.replyTo 得到客户端传来的 Messenger 对象
                    Messenger workMessenger = msg.replyTo;

                    Message serviceMsg = Message.obtain(null, WorkService.MSG_FROM_CLIENT);

                    Bundle serviceBundle = new Bundle();

                    serviceBundle.putString("rep", "收到,客户端你好,这里是服务端!!!");

                    serviceMsg.setData(serviceBundle);

                    try {
                        //发送消息给客户端
                        workMessenger.send(serviceMsg);

                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }

                    break;
            }

        }
    };

    @Override
    public IBinder onBind(Intent intent) {
        //通过接收消息的 Handler 来获取 Binder 对象
        return new Messenger(workHandler).getBinder();
    }

}
2、在清单文件中注册服务:android:process 必须给值 让服务端与客户端运行在不同的进程 “:” 表示项目包名 后面的值任意

     <service android:name=".WorkService"
            android:label="@string/app_name"
            android:process=":workProcess">

        </service>
3、客户端代码:

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.Process;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    //声明一个 Handler 对象来接收服务端发送来的消息
    private Handler mainHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case WorkService.MSG_FROM_CLIENT:
                    Log.d("RJie", "MainActivity: " + msg.getData().getString("rep"));
                    break;
            }
        }
    };

    private Messenger mainMessenger;

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

        //打印出 UI 线程所在进程的id

        Log.d("RJie", "MainActivity.pid==" + Process.myPid());

        //绑定服务端
        Intent workServiceIntent = new Intent(MainActivity.this, WorkService.class);

        bindService(workServiceIntent, sc, Context.BIND_AUTO_CREATE);


    }
    //声明一个 ServiceConnection 来对客户端与服务端的连接后业务进行处理
    private ServiceConnection sc = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //通过 IBinder 对象创建一个 Messenger 对象
            mainMessenger = new Messenger(service);

            Message mainMessage = Message.obtain(mainHandler, WorkService.MSG_FROM_CLIENT);

            Bundle mainBundle = new Bundle();

            mainBundle.putString("msg", "这里是客户端,听到请回答!!!");

            mainMessage.setData(mainBundle);
            //将 Messenger 对象传递给服务端
            mainMessage.replyTo = new Messenger(mainHandler);

            try {
                //发送消息给服务端
                mainMessenger.send(mainMessage);

            } catch (RemoteException e) {
                e.printStackTrace();
            }


        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解绑服务端
        unbindService(sc);
    }

}
运行结果:

06-16 20:18:54.907 3668-3668/? D/RJie: MainActivity.pid==3668
06-16 20:18:54.987 3688-3688/? D/RJie: WorkService.pid==3688
06-16 20:18:55.057 3688-3688/? D/RJie: WorkService: 这里是客户端,听到请回答!!!
06-16 20:18:55.110 3668-3668/? D/RJie: MainActivity: 收到,客户端你好,这里是服务端!!!

到这,简单的 Messenger 使用就完成了。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值