AIDL的使用
<h1>一.什么是AIDL</h1>
<p>AIDL(Android Interface Definition Language)是一种接口定义语言,可实现进程间通信</p>
<h1>二.AIDL的使用</h1>
<h3>1.创建aidl文件</h3>
<p>需要在aidl文件中写一个接口,接口里面写你想要回调的方法
例如</p>
<pre><code class="language-java">package com.ojr.aidl;
import com.ojr.aidl.Person;
interface IPerson{
String say(String someone);
String greet(in Person person);
}</code></pre>
<p>需要注意:
aidl文件接口里面的方法不可用,public,private的关键字修饰</p>
<p>可以引用其它aidl文件中定义的接口,但是不能够引用java类文件中定义的接口</p>
<p>AIDL服务默认支持类型: Java的原生类型,String和CharSequence, List 和 Map ,List和Map 对象的元素必须是AIDL支持的数据类型(其他类型需要import,如例子中的Person)</p>
<p>非原始类型中,除了String和CharSequence以外,其余均需要一个方向指示符。方向指示符包括in、out、和inout。in表示由客户端设置,out表示由服务端设置,inout表示客户端和服务端都设置了该值。</p>
<h3>2.创建服务端</h3>
<p>IPerson接口中的抽象内部类Stub继承android.os.Binder类并实现IPerson接口,比较重要的方法是asInterface(IBinder)方法,该方法会将IBinder类型的对象转换成IPerson类型,必要的时候生成一个代理对象返回结果。[该文件通过aidl文件在gen目录下自动生成](<a href="http://docs.y/Public/Uploads/2016-04-27/5720730aa6f28.png">http://docs.y/Public/Uploads/2016-04-27/5720730aa6f28.png</a> "该文件通过aidl文件在gen目录下自动生成")然后,在aidlservice的onbind方法中返回stub</p>
<pre><code class="language-java"> @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return stub;
}
IPerson.Stub stub = new IPerson.Stub() {
@Override
public String say(String someone) throws RemoteException {
// TODO Auto-generated method stub
Log.d(TAG, &quot; say: &quot; + someone);
return &quot;Hello &quot; + someone;
}
@Override
public String greet(Person person) throws RemoteException {
String greeting = &quot;hello, &quot; + person.getName();
switch (person.getSex()) {
case 0:
greeting = greeting + &quot;, you're handsome.&quot;;
break;
case 1:
greeting = greeting + &quot;, you're beautiful.&quot;;
break;
}
return greeting;
}
};</code></pre>
<h3>3.创建客户端</h3>
<p>需要把服务端的aidl文件copy到客户端中,编译器同样会生成相对应的IPerson.java文件</p>
<p>在客户端中,需要重写ServiceConnection中的onServiceConnected方法将IBinder类型的对像转换成IPerson类型
绑定aidlservice之后就可以进行进程间的通信了</p>
<pre><code class="language-java"> private IPerson person;
private ServiceConnection conn = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(&quot;ServiceConnection&quot;, &quot;onServiceConnected() called&quot;);
person = IPerson.Stub.asInterface(service);
Log.d(TAG, &quot;BIND+++success&quot;);
}
@Override
public void onServiceDisconnected(ComponentName name) {
//This is called when the connection with the service has been unexpectedly disconnected,
//that is, its process crashed. Because it is running in our same process, we should never see this happen.
Log.i(&quot;ServiceConnection&quot;, &quot;onServiceDisconnected() called&quot;);
}
};</code></pre>
<h3>三.AIDL传递复杂对象</h3>
<p>传递的对象类需要实现Parcelable接口
必须提供一个名为CREATOR的static final属性 该属性需要实现android.os.Parcelable.Creator<T>接口
读取变量与写入变量的顺序需一致,不然会出错</p>
<h3>四.写AIDL注意事项</h3>
<ol>
<li>
<p>客户端和服务端的AIDL接口文件所在的包必须相同</p>
</li>
<li>需要一个Service类的配合</li>
</ol>
<h3>五.AIDL配合回调接口跨进程通信</h3>
<p><a href="http://blog.csdn.net/yus201120/article/details/53202517"> AIDL初探:夸进程的通信和跨进程的回调机制</a></p>
<p><a href="http://blog.csdn.net/wikiday/article/details/43459373"> android中跨进程之间的异步回调</a></p>