Android IPC通信 Messenger

Messenger通信是基于AIDL的通信,即有服务端和客户端

            1、服务器部分

public class MyService extends Service {
    private static final String TAG = "MyService";
    public MyService() {
    }

    private static class MyServiceHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1: {
                    Log.d(TAG, "handleMessage: " + msg.getData().getString("msg"));

                    /**
                     *  服务器的回复
                     */
                    Messenger client = msg.replyTo; //msg.replyTo获取Messenger
                    Message replyMessage = Message.obtain(null,2);

                    Bundle bundleForClient = new Bundle();
                    bundleForClient.putString("reply","get it");
                    replyMessage.setData(bundleForClient);
                    try {
                        client.send(replyMessage);
                    }catch (Exception e) {
                        e.printStackTrace();
                    }
                    //======================
                    break;
                }
                default:
                    super.handleMessage(msg);
            }
        }
    }

    private final Messenger messenger = new Messenger(new MyServiceHandler());
    @Override
    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
    }
}
记得在AndroidManifest中在Service里加入下方来开启另一个进程(可以实现两个程序间通信)
android:process=":remote"

             2、客户端部分

          

public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";
    private Messenger messengerSer;
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            messengerSer = new Messenger(service);//Messenger用来发送Message
            Message msg = Message.obtain(null,1);
            //数据封装
            Bundle data = new Bundle();
            data.putString("msg","hello");
            msg.setData(data);

            /**
             * 客户端发消息时,需要把接收服务器回复的Messenger通过Message的replyTo传递给服务器
             */
            msg.replyTo = mGetReplyMessenger;
            //======================

            try{
                messengerSer.send(msg);
            }catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    /**
     * 这里是收到服务器消息后的处理
     */
    private static class MessengerHandlerToGetServiceHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 2:
                    Log.d(TAG, "handleMessage: " + msg.getData().getString("reply"));
                    break;
                default:
                    super.handleMessage(msg);
            }

        }
    }
    private Messenger mGetReplyMessenger = new Messenger(new MessengerHandlerToGetServiceHandler());
    //=================


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button)findViewById(R.id.buttonS);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //通过bind来发送server
                Intent intent = new Intent(MainActivity.this,MyService.class);
                bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE);
            }
        });

    }

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

猜你喜欢

转载自blog.csdn.net/fyq520521/article/details/80239144
今日推荐