IPC--Messenger

IPC

前言

IPC -->Intent process communication 进程间通信或者进程通信

Android中多进程模式

开启方式,在清单文件中设置process的值如 android:process:":remote"
”:":表示要在当前进程名前面附加上当前的包名,
包名加”:“完整的命名方式,进程名以”:“开头表示属于当前应用的私用进程,不以”:“开头的属于全局进程,通过ShareUID共享信息
Android中的多进程一个进程开启一个虚拟机运行,多进程的缺点:
1.静态变量和单例模式完全失效(一个进程一个虚拟机,不同的虚拟机内存分配上有不同的地址空间)
2.线程同步机制完成失效(同理,由于不是同一块内存,不管锁对象还是锁全局类都无法保证线程同步,不同进程锁的不是同一个对象)
3.SharedPreferences的可靠性下降(sp底层是通过读写xml文件实现,不支持并发读写,不然会有问题)
4.Application会多次创建(运行在同一个进程的组件是属于同一个虚拟机和同一个Application的)

通过Messenger进行IPC

1.使用Bundle传递基本数据类型、序列化对象以及Android支持的一下特殊对象
2.使用文件共享,适合对数据同步要求不高的进程间通信
3.使用Messenger,底层是AIDL实现
实现:
1.服务端
在服务端创建一个Service处理客户端的连接请求
同时创建一个Handler,在Handle中创建Messenger对象
在Service中的onBind()中返回这个Messenger对象底层的Binder
2.客户端
绑定服务端的Service,绑定成功后通过服务端返回的IBinder对象创建一个Messenger,有这个Messenger后就可以向服务端发消息。发的是Message对象
如果需要服务端可以回应客户端,就像回应服务端那样,我们就还需要创建一个Handler并创建一个新的Messenger,并把这个Messenger对象通过Message的replyTo参数传递给服务端,服务端通过这个replyTo参数就可以回应客户端
eg:
服务端

package com.hwt.mvpproject_hwt.test;

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 MessengerService extends Service {

    private final Messenger messenger = new Messenger(new MessengerHandler());

    public MessengerService() {
    }

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



    public static class MessengerHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 1:
                    Log.i("ARROW", "handleMessage: "+msg.getData());

                    Messenger client = msg.replyTo;

                    Message message = Message.obtain(null,0);
                    Bundle bundle = new Bundle();
                    bundle.putString("reply","好好好");
                    message.setData(bundle);

                    try {
                        client.send(message);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    break;
            }
        }
    }
}

客户端

package com.hwt.mvpproject_hwt.test;

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

import com.hwt.mvpproject_hwt.R;

public class MessengerActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_messenger);
        Intent intent = new Intent(this,MessengerService.class);
        bindService(intent,serviceConnection,BIND_AUTO_CREATE);
    }

    private Messenger messenger;
    private Messenger getReplyToMessenger = new Messenger(new MessengerHandler());

    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            messenger = new Messenger(service);
            Message msg = Message.obtain(null,1);
            Bundle data = new Bundle();
            data.putString("msg","Hello,Service");
            msg.setData(data);

            //接受服务端的数据需要的replyTo参数传递给服务端
            msg.replyTo = getReplyToMessenger;

            try {
                messenger.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    private static class MessengerHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 0:
                    Log.i("ARROW", "handleMessage: client"+msg.getData());
                    break;
            }
        }
    }

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

服务端和客户端通过Messenger两者互相进行通信的流程
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页