Android进程间的通信

1.IPC进程间的通信(Inter Process Communication)

定义:进程间通过内核提供的机制完成数据交换

2.Android多进程

  • Application生命周期(onCreate)
  • 数据共享失效(对象、单例、回调)
  • 进程间通信(文件、Intent、AIDL)

3.以下通过AIDL的三种方式实现进程间的通信

3.1.IBinder:

实现步骤:

3.1.1:首先创建一个aidl接口,在其写需要用到的几个方法

// IConnectionService.aidl
package com.hongyi.aidlserviceconnection;

interface IConnectionService {
    oneway void connect();
    void disconnect();
    boolean isConnected();
}

3.1.2:在MyService中实现这个接口,重写这几个方法

    private Handler mHandler = new Handler(Looper.getMainLooper());    
    private boolean isConnected = false;
    private IConnectionService iConnectionService = new IConnectionService.Stub() {

        @Override
        public void connect() throws RemoteException {
            try {
                Thread.sleep(3000);
                isConnected = true;
                mHandler.post(() -> {
                    Toast.makeText(MyService.this, "通信已连接", Toast.LENGTH_SHORT).show();
                });
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void disconnect() throws RemoteException {
            isConnected = false;
            mHandler.post(() -> {
                Toast.makeText(MyService.this, "通信已断开", Toast.LENGTH_SHORT).show();
            });
        }

        @Override
        public boolean isConnected() throws RemoteException {
            return isConnected;
        }
    };

 3.1.3 在onBind方法中返回该参数

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return iConnectionService.asBinder();
    }

 3.1.4 在activity中实现

  • 在onCreate方法:
    Intent mIntent = new Intent(this, MyService.class);
    bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
  • 定义ServiceConnection对象:
        private IConnectionService mIConnectionServiceProxy;
    
        ServiceConnection mServiceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                mIConnectionServiceProxy = IConnectionService.Stub.asInterface(service);
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
    
            }
        };
        @Override
        public void onClick(View v) {
            int vid = v.getId();
            if (vid == R.id.connect) {
                try {
                    mIConnectionServiceProxy.connect();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            } else if (vid == R.id.disconnect) {
                try {
                    mIConnectionServiceProxy.disconnect();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            } else if (vid == R.id.connect_state) {
                try {
                    boolean isConnected = mIConnectionServiceProxy.isConnected();
                    if (isConnected) {
                        Toast.makeText(this, "已连接", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(this, "未连接", Toast.LENGTH_SHORT).show();
                    }
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        }

2.Message

3.2.1 同理,首先创建一个aidl接口,写需要实现的接口方法

// IMessageService.aidl
package com.hongyi.aidlserviceconnection;
import com.hongyi.aidlserviceconnection.entity.Message;
// 消息服务
interface IMessageService {
    void sendMessage(inout Message message);
}

3.2.2 在java目录的包下创建实体类

package com.hongyi.aidlserviceconnection.entity;

import android.os.Parcel;
import android.os.Parcelable;

public class Message implements Parcelable {
    private String content;
    private boolean isSendMessageState;

    public Message(){

    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public boolean isSendMessageState() {
        return isSendMessageState;
    }

    public void setSendMessageState(boolean sendMessageState) {
        isSendMessageState = sendMessageState;
    }

    public static Creator<Message> getCREATOR() {
        return CREATOR;
    }

    protected Message(Parcel in) {
        content = in.readString();
        isSendMessageState = in.readByte() != 0;
    }

    public static final Creator<Message> CREATOR = new Creator<Message>() {
        @Override
        public Message createFromParcel(Parcel in) {
            return new Message(in);
        }

        @Override
        public Message[] newArray(int size) {
            return new Message[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(content);
        dest.writeByte((byte) (isSendMessageState ? 1 : 0));
    }


    public void readFromParcel(Parcel in) {
        content = in.readString();
        isSendMessageState = in.readByte() == 1 ;
    }
}

 3.2.3 在aidl目录下同样创建实体类,引入java目录下的实体类

package com.hongyi.aidlserviceconnection.entity;
parcelable Message;

 3.2.4 在MyService实现IMessageService重写方法

private IMessageService iMessageService = new IMessageService.Stub() {
        @Override
        public void sendMessage(Message message) throws RemoteException {
            mHandler.post(() -> {
                Toast.makeText(MyService.this, message.getContent(), Toast.LENGTH_SHORT).show();
            });
        }
};

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return iMessageService.asBinder();
}

3.2.5 在activity实现

Intent mIntent = new Intent(this, MyService.class);
bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);

ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mIMessageServiceProxy = IMessageService.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
            try {
                Message message = new Message();
                message.setContent("message from main");
                mIMessageServiceProxy.sendMessage(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }

3.Messenger

这个跟上面两个差不多的,就不详细写了,我贴上源代码吧

AIDLServiceConnection: android跨进程间的通信,通过实现AIDL接口,实现IBinder,Message,Messenger等实现

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值