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等实现