首先我们要明白aidl的作用是什么?比如说我们提供了一个服务,当别的程序(可以看成是一个其他的进程)要来使用我们提供的服务的时候,这个时候就需要用到aidl来进行通信.至于实现的原理度娘里面有大量的文章可以参考,并不是本文重点,所以不做赘述.
首先我们先来看看实现的效果.如下图所示.我们提供了一个加法计算的服务,在客户端使用aidl连接好服务端,然后传递参数给远程服务,就可以拿到计算后的值.
是不是非常的酷炫,下面就手把手的的教你在Android studio下面如何使用aidl技术实现如下的效果.
1.首先创建一个提供服务server App然后再创建一个访问服务的client App
.
2.接下来我们先对server 端的程序进行编辑.首先我们需要创建一个aidl的文件.创建目录如下图所示.这里我们创建一个名称为Calculation的aidl文件.
3.接着我们需要对aidl的接口文件进行编辑,我们可以提供相应的方法.
// Calculation.aidl
package com.dapeng.aidldemo;
interface Calculation {
void addition(int a,int b);
}
3.编辑好以后我们接下来生成aidl接口.首先要看看我们aidl所在的包是否是和我们清单文件的中的包名是否是一致的.如果是一致的我们直接点击rebuild parject.
4.定义好aidl接口以后我们再来编辑服务端的代码.创建一个类继承service,并且在清单文件中配置好他的action,这里我们使用自己的包名去定义action.
public class CalculateService extends Service {
public CalculateService() {
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onCreate() {
super.onCreate();
Log.d("--", "onCreate");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("--", "onDestroy");
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.d("--", "onStart");
}
@Override
public boolean onUnbind(Intent intent) {
Log.d("--", "onUnbind");
return super.onUnbind(intent);
}
Calculation.Stub mBinder = new Calculation.Stub() {
@Override
public int addition(int a, int b) throws RemoteException {
return a + b;
}
};
}
<service
android:name=".CalculateService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.dapeng.aidldemo.CalculateService"/>
</intent-filter>
</service>
5.到此服务端的代码也就完成了.接着我们来写客户端的逻辑,首先是在客户端建一个和服务端的的aidl一样的包名并且将aidl接口文件放进去.然后rebuild project.
6.编辑客户端的代码进行实现.这里需要注意的是在使用隐式开启服务的时候在5.0及以上版本默认是不能直接通过action开启的,使用意图的时候加上setpackage就可以解决.
public class MainActivity extends AppCompatActivity {
private EditText etOne, etTwo;
private Button btn;
private TextView tv;
private Calculation mCalculation;
private ServiceConnection mServiceConnection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化界面
etOne = (EditText) findViewById(R.id.etone);
etTwo = (EditText) findViewById(R.id.ettwo);
btn = (Button) findViewById(R.id.btn);
tv = (TextView) findViewById(R.id.tv);
//连接远程服务
mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mCalculation = Calculation.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
mCalculation = null;
}
};
//使用意图对象绑定开启服务
Intent intent = new Intent();
intent.setAction("com.dapeng.aidldemo.CalculateService");
//在5.0及以上版本必须要加上这个
intent.setPackage("com.dapeng.aidldemo");
bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s = etOne.getText().toString();
String s1 = etTwo.getText().toString();
if (TextUtils.isEmpty(s) && TextUtils.isEmpty(s1)) {
Toast.makeText(MainActivity.this, "您输入的数字不合法", Toast.LENGTH_SHORT).show();
} else {
try {
int addition = mCalculation.addition(Integer.parseInt(s), Integer.parseInt(s1));
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("调用远程服务获取到的计算结果是==");
stringBuilder.append(addition);
tv.setText(stringBuilder.toString());
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
}
}
到此为止功能就实现.快快去体验这酷炫的功能吧.