一、概念
1.两个应用之间通信
AIDL:表示两者之间需要遵循的协议
2.范围: 如:Action或data启动另外一个应用的Activity或Service
3.角色:
1)服务端口(Server):
1)字面:与客户端口通讯的方式抽象成接口,并编写AIDL文件
2)常规:实现一个Server,处理客户端口请求
2) 客户端口(Client) :
1)字面:需要将服务端口AIDL文件CP过来,通过intent方式启动服务端Server
2)常规: app(Clilent) 唤起另外一个 APP (Server),并进行两者之间的通讯
二、代码
1.客户端口ActivityA
public class MainActivity extends AppCompatActivity {
//用于接收实例
private ServerAidl serverAidl;
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//连接服务
//2.服务端给我们的Binder,调用asInterface,得到了ServerAidl实例
serverAidl = ServerAidl.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
//连接中断
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent mIntent = new Intent(this, MessageServer.class);
//1.绑定服务
bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
public void getName(View v) {
try {
//3.获取实例的值
Toast.makeText(this, serverAidl.getCliencName(), Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
2.客户端ActivityB
Intent mIntent = new Intent(this, MessageServer.class);
startService(mIntent);
3.MessageServer (ActivityA、B内容(MesageServer,ServerAidl是一样的)
public class MessageServer extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/**
*
*/
private ServerAidl.Stub mBinder = new ServerAidl.Stub() {
@Override
public String getCliencName() throws RemoteException {
return "小王";
}
@Override
public int getAge() throws RemoteException {
return 12;
}
};
}
4.ServerAidl.didl
interface ServerAidl {
String getCliencName();
int getAge();
}
5.ServerAidl.java
//这里是获取代理部分
public static com.example.my_ipc_server.ServerAidl asInterface(android.os.IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin != null) && (iin instanceof com.example.my_ipc_server.ServerAidl))) {
return ((com.example.my_ipc_server.ServerAidl) iin);
}
// 4.给我们返回了一个Proxy
return new com.example.my_ipc_server.ServerAidl.Stub.Proxy(obj);
}
//这里是代理部分
private static class Proxy implements com.example.my_ipc_server.ServerAidl {
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote) {
mRemote = remote;
}
@Override
public android.os.IBinder asBinder() {
return mRemote;
}
public java.lang.String getInterfaceDescriptor() {
return DESCRIPTOR;
}
@Override
//5.读取用户名
public java.lang.String getCliencName() throws android.os.RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
java.lang.String _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
//这里会调用服务端的transact
mRemote.transact(Stub.TRANSACTION_getCliencName, _data, _reply, 0);
//这里reply已经有值了
_reply.readException();
//把写入的值读取出来
_result = _reply.readString();
} finally {
_reply.recycle();
_data.recycle();
}
//最终将值返回
return _result;
}
4.这里是onTransact
@Override
//6.服务端口的onTransact方法将内容写入reply
public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
java.lang.String descriptor = DESCRIPTOR;
switch (code) {
case INTERFACE_TRANSACTION: {
reply.writeString(descriptor);
return true;
}
case TRANSACTION_getCliencName: {
data.enforceInterface(descriptor);
java.lang.String _result = this.getCliencName();
//服务端口将内容写入reply中
reply.writeNoException();
reply.writeString(_result);
return true;
}...