一、客户端向服务端通信。
1、创建AIDL文件,用于生成跨进程通信代码。
// ITestService.aidl
package com.example.servicetest;
interface ITestService {
void sayHello();
}
2、创建服务端Service,添加如下代码。
public class TestService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new TestBinder();
}
class TestBinder extends ITestService.Stub {
@Override
public void sayHello() throws RemoteException {
Log.i("TestService","Hello Service!");
}
}
}
3、在AndroidManifest.xml中声明刚添加的Service。
<service
android:name=".TestService"
android:exported="true"
android:process="com.test">
<intent-filter>
<action android:name="com.example.service.test"/>
</intent-filter>
</service>
4、客户端绑定服务端Service,并与服务端进行通信。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setAction("com.example.service.test");
// Android高版本中必须要设置包名,不然会报错
intent.setPackage("com.example.servicetest");
// 绑定服务端Service
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
try {
// 获取服务端Service的引用
ITestService testService = ITestService.Stub.asInterface(service);
// 与服务端进行通信
testService.sayHello();
} catch (RemoteException e) {
throw new RuntimeException(e);
}
}
@Override
public void onServiceDisconnected(ComponentName name) {}
};
5、如果客服端与服务端通信成功,则会打印"Hello Service!"。
二、服务端与客户端进行通信。
1、新建AIDL文件,用与服务端与客户端的通信。
// ICallback.aidl
package com.example.servicetest;
interface ICallback {
void reply(String msg);
}
2、在ITestService.aidl文件中添加新的接口register。
// ITestService.aidl
package com.example.servicetest;
import com.example.servicetest.ICallback;
interface ITestService {
void sayHello();
void register(ICallback callback); // 新添加的
}
3、在MainActivity中添加ICallback的实现,并将callback对象传递给服务端Service。
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
try {
// 获取服务端的引用
ITestService testService = ITestService.Stub.asInterface(service);
// 与服务端进行通信
testService.sayHello();
// 将callback对象传递给服务端Service
testService.register(callback);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
}
@Override
public void onServiceDisconnected(ComponentName name) {}
};
ICallback callback = new ICallback.Stub() {
@Override
public void reply(String msg) throws RemoteException {
Log.i("MainActivity", msg);
}
};
4、服务端Service的register的实现如下。
class TestBinder extends ITestService.Stub {
@Override
public void sayHello() throws RemoteException {
Log.i("TestService","Hello Service!");
}
@Override
public void register(ICallback callback) throws RemoteException {
callback.reply("Nice to meet you!"); // 服务端向客户端通信
}
}
5、如果服务端与客户端通信成功,则会打印"Nice to meet you!"。
附录:项目文件结构图