网上相关信息很多,但一是因为使用步骤繁琐,二是没法快速锁定所需,故总结于此,只为用时便宜,也可以供他人参考,更想培养总结分享习惯。
AIDL使用步骤主要有:
服务端:
1、创建AIDL文件,在这里面定义远程接口。
2、生成Java接口文件。
3、建立一个Service的子类,并且记得在AndroidManifest.xml文件中配置。
客户端:
1、拷贝服务器端的AIDL文件,并生成Java接口文件。
2、用BindService来调用Service,与调用普通Serivce相类似,只是获取IBinder的方式有点不一样。
具体操作:
创建两个项目工程:
AIDLServer(服务端)
AIDLClient(客户端)
服务端:
1:创建AIDL文件IAidlInterface
代码如:
interface IAidlInterface {
/**
* 自定义方法(传参与增加返回值,参数必须为基本参数或实现Parcelable等接口的可序列化与反序列化特性)
*/
void evokeClient(String msg);
}
2:编译项目
build–>make project
3:确认AIDL是否编译成功
4:创建服务 EvokeService
代码如:
public class EvokeService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new IEvokeService();
}
public class IEvokeService extends IAidlInterface.Stub{
@Override
public void evokeClient(String msg) throws RemoteException {
Log.e("**********",msg);
/**
*唤醒AIDLServer中页面,Intent.FLAG_ACTIVITY_NEW_TASK表示新起任务栈
*/
Intent intent = new Intent();
intent.setClass(EvokeService.this,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
}
5、manifests文件中注册该服务
<service android:name=".EvokeService"
android:process=":remote" >
<intent-filter>
<action android:name="seven.com.aidlsever.EvokeService" />
</intent-filter>
</service>
客户端:
1、将aidl文件整个包拷贝至客户端项目中,如图结构
服务端
客户端
2、实现如下代码
public class MainActivity extends Activity implements View.OnClickListener {
private IAidlInterface mService;
private Button btn_bind, btn_get;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
btn_bind = (Button) findViewById(R.id.btn_bind);
btn_get = (Button) findViewById(R.id.btn_get);
btn_bind.setOnClickListener(this);
btn_get.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_bind:
Intent intent = new Intent();
intent.setAction("seven.com.aidlsever.EvokeService");
//从 Android 5.0开始 隐式Intent绑定服务的方式已不能使用,所以这里需要设置所在服务端的包名
intent.setPackage("seven.com.aidlsever");
bindService(intent, connection, Context.BIND_AUTO_CREATE);
break;
case R.id.btn_get:
try {
mService.evokeClient("来自客户端消息");
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (connection != null) {
unbindService(connection);
}
}
}