在使用AIDL通信的时候,在Stub类中都会生成一个asInterface函数,以《Android开发艺术探索》中的例子来分析,其生成的asInterface函数源码为:
1 /**
2 * Cast an IBinder object into an com.willhua.demoaidl.aidl.IBookManager
3 * interface, generating a proxy if needed.
4 */
5 public static com.willhua.demoaidl.aidl.IBookManager asInterface(
6 android.os.IBinder obj) {
7 if ((obj == null)) {
8 return null;
9 }
10 android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
11 if (((iin != null) && (iin instanceof com.willhua.demoaidl.aidl.IBookManager))) {
12 return ((com.willhua.demoaidl.aidl.IBookManager) iin);
13 }
14 return new com.willhua.demoaidl.aidl.IBookManager.Stub.Proxy(obj);
15 }
我们知道asInterface的作用是根据调用是否属于同进程而返回不同的实例对象,但是对于该过程是怎么进行的,返回的到底是什么东西,可能很多童鞋不是很清楚,就这个问题分享一点我的理解。显然,通过代码可知,决定返回何种对象的关键在obj.queryLocalInterface(DESCRIPTOR)的返回结果。
下面我们通过实际DEMO来了解其过程。代码基于《Android开发艺术探索》中的例子。
DEMO中有主要有两个东西,一个就是MainActivity,一个就是BookService,MainActivity会去bind BookService,而BookService通过在Manifest中设置android:process而使之分别与MainActivity运行在同进程和异进程。
主要代码:
public class BookService extends Service {
private Binder mBinder = new IBookManager.Stub() {
...
};
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
LOG("BookService onBind mBinder:" +mBinder.getClass().getName() + " Process:" + Process.myPid());
return mBinder;
}
}
public class MainActivity extends Activity{
private IBookManager mService;
private Button mQuery;
private TextView mOutInfo;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connectService();
}
private void connectService(){
Intent intent = new Intent(getApplicationContext(), BookService.class);
bindService(intent, new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
LOG("onServiceConnected " + service);
mService = IBookManager.Stub.asInterface(service);
}
}, BIND_AUTO_CREATE);
}
...
}
public static abstract class Stub extends android.os.Binder implements
com.willhua.demoaidl.aidl.IBookManager {
private static final java.lang.String DESCRIPTOR = "com.willhua.demoaidl.aidl.IBookManager";
/** Construct the stub at attach it to the interface. */
public Stub() {
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.willhua.demoaidl.aidl.IBookManager
* interface, generating a proxy if needed.
*/
public static com.willhua.demoaidl.aidl.IBookManager asInterface(
android.os.IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin != null) && (iin instanceof com.willhua.demoaidl.aidl.IBookManager))) {
return ((com.willhua.demoaidl.aidl.IBookManager) iin);
}
return new com.willhua.demoaidl.aidl.IBookManager.Stub.Proxy(obj);
}
...
}
androd.os.Binder部分源码:
public class Binder implements IBinder {
//...
/**
* Convenie