1. 进程间通信的方式
- 使用
Bundle
- 文件共享(文件锁)
- 使用
Messenger
(串行,单向) - 使用
AIDL
2. 创建 server
端
这里重新创建了一个 module
作为 server
端。
- 创建一个
aidl
文件 ; - 创建
service
实现aidl
中的接口 ; - 暴露
service
;
2.1 创建 aidl
文件
直接在
java
文件夹下新建 aidl
文件即可,然后会自动生成 aidl
文件夹,我们创建一个 IEasyService.aidl
package com.test.server;
// Declare any non-default types here with import statements
interface IEasyService {
void connect(String mes);
void disConnect(String mes);
}
2.2 创建 service
实现接口
public class EasyService extends Service {
@Override
public IBinder onBind(Intent intent) {
Log.i("qq","onBind: intent="+intent.toString());
return mBinder;
}
IEasyService.Stub mBinder = new IEasyService.Stub() {
@Override
public void connect(String mes) throws RemoteException {
Log.i("qq","connect: mes = "+mes);
}
@Override
public void disConnect(String mes) throws RemoteException {
Log.i("qq","disConnect: mes = "+mes);
}
};
@Override
public boolean onUnbind(Intent intent) {
Log.i("qq","onUnbind: ");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Log.i("qq","onDestroy: ");
super.onDestroy();
}
}
如果你发现你的 IEasyService.Stub
里面实现的方法没有 connect
,就手动点下这个图标
。
2.3 暴露 service
在 清单文件中注册一下服务。
3. 创建 client
端
把 server
端的 aidl
文件复制到 client
中,必须包名也是一样的。
然后就可以点击按钮,绑定远程服务,获取到远程服务的代理对象,进而调用远程方法啦~
代码如下
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
findViewById(R.id.load).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//绑定远端服务
Intent intent = new Intent("com.test.server.IEasyService");
intent.setPackage("com.test.server") ;
bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
}
});
findViewById(R.id.clear).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mEasyService != null ){
try {
mEasyService.connect("Client connect");
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
}
private IEasyService mEasyService;
ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mEasyService = IEasyService.Stub.asInterface(service);
Log.i("qq","已连接上远程服务");
}
@Override
public void onServiceDisconnected(ComponentName name) {
mEasyService = null;
Log.i("qq","已断开上远程服务");
}
};
然后运行看下结果: